You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:30:03