C#中如何将不同类别商品列表添加到ViewModel并传递至视图
解决按分类分组展示商品的ViewModel赋值问题
核心思路
你不需要创建List<ProductsViewModel>,而是创建单个ProductsViewModel实例即可——它本身就是用来承载所有分类商品的容器,不是单个商品的模型。你只需要把不同分类的商品ViewModel集合,分别赋值给它的三个属性就行。
步骤1:实现实体到ViewModel的转换
假设你的数据库实体类是Cake、Pizza、FastFood,需要把这些实体对象转换成对应的ViewModel,两种方式可选:
手动映射(适合新手理解)
// 从数据库查询蛋糕并转换为CakesViewModel集合 var cakesVM = db.Cakes.Where(c => c.Category_ID == 蛋糕分类ID) .Select(c => new CakesViewModel { // 逐个映射实体与ViewModel的属性 Id = c.Id, Name = c.Name, Price = c.Price, // 其他需要的属性... }) .ToList(); // 转换披萨列表 var pizzasVM = db.Pizzas.Where(p => p.Category_ID == 披萨分类ID) .Select(p => new PizzaViewModel { Id = p.Id, Name = p.Name, Size = p.Size, // 其他需要的属性... }) .ToList(); // 转换快餐列表 var fastFoodsVM = db.FastFoods.Where(f => f.Category_ID == 快餐分类ID) .Select(f => new FastFoodsViewModel { Id = f.Id, Name = f.Name, Calories = f.Calories, // 其他需要的属性... }) .ToList();
用AutoMapper简化(属性名一致时推荐)
如果实体和ViewModel的属性名称完全匹配,可以用AutoMapper自动映射:
// 先在Startup/Program.cs中配置映射关系 var config = new MapperConfiguration(cfg => { cfg.CreateMap<Cake, CakesViewModel>(); cfg.CreateMap<Pizza, PizzaViewModel>(); cfg.CreateMap<FastFood, FastFoodsViewModel>(); }); IMapper mapper = config.CreateMapper(); // 控制器中直接转换 var cakesVM = mapper.Map<List<CakesViewModel>>(db.Cakes.Where(c => c.Category_ID == 蛋糕分类ID)); var pizzasVM = mapper.Map<List<PizzaViewModel>>(db.Pizzas.Where(p => p.Category_ID == 披萨分类ID)); var fastFoodsVM = mapper.Map<List<FastFoodsViewModel>>(db.FastFoods.Where(f => f.Category_ID == 快餐分类ID));
步骤2:赋值给ProductsViewModel并传递到视图
在控制器的Action里,创建ProductsViewModel实例,把转换后的集合赋值给对应属性,再传递给视图:
public IActionResult Index() { // 执行上面的转换逻辑... var productsVM = new ProductsViewModel { CakesVM = cakesVM, PizzaVM = pizzasVM, FastFoodsVM = fastFoodsVM }; return View(productsVM); }
步骤3:视图中展示分组商品
在视图顶部声明模型类型,然后分别遍历每个分类的集合:
@model ProductsViewModel <h2>蛋糕列表</h2> <ul> @foreach(var cake in Model.CakesVM) { <li>@cake.Name - ¥@cake.Price</li> } </ul> <h2>披萨列表</h2> <ul> @foreach(var pizza in Model.PizzaVM) { <li>@pizza.Name - @pizza.Size</li> } </ul> <h2>快餐列表</h2> <ul> @foreach(var fastFood in Model.FastFoodsVM) { <li>@fastFood.Name - @fastFood.Calories 大卡</li> } </ul>
内容的提问来源于stack exchange,提问作者Dev Beginner
相关产品推荐
相关产品推荐

