如何在 viewmodel 中编写映射列表的方法并在 razor 视图中显示集合

how to write method for mapping lists in viewmodel and display collection in razor view

我正在尝试在我的 Pro() 方法中显示所有产品的集合(使用视图模型)

车型

public class Product
{
    public Product() { this.AddDate = DateTime.Now; }

    public int ProductId { get; set; }
    [Required(ErrorMessage = "Enter Product name")]
    [StringLength(160)]
    public string ProductName { get; set; }
    [Required(ErrorMessage = "Enter Product Description")]
    [StringLength(500)]
    public string ProductDescription { get; set; }
    public DateTime AddDate { get ; private set; }
    [Required(ErrorMessage = "Select Category")]
    [Display(Name="Category")]
    public string Category { get; set; }
    [Required(ErrorMessage = "Location")]
    public bool location { get; set; }
}

public class ProductPicture
{
    public int id { get; set; }
    public int ProductId { get; set; }
    [Required(ErrorMessage ="Please Select Picture")]
    public string pictureurl { get; set; }
}

查看模型

public class ProductViewModel
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    [Required(ErrorMessage = "Enter Product Description")]
    [StringLength(500)]
    public string ProductDescription { get; set; }
    public DateTime AddDate { get; private set; }
    [Required(ErrorMessage = "Select Category")]
    [Display(Name = "Category")]
    public string Category { get; set; }
    [Required(ErrorMessage = "Location")]
    public bool location { get; set; }
    public IEnumerable<ProductPicture> ProductPictures { get; set; }
}

控制器方法

 public ActionResult pro()
 {     
     ProductViewModel product = new ProductViewModel();
     var pro = db.Products.ToList();
     if (pro != null)
     {
         product.ProductName = pro.ProductName;
         product.ProductDescription = pro.ProductDescription;
         product.Payextra = pro.Payextra;
         product.location = pro.location;
           product.ProductPictures = db.ProductPictures.Where(m => m.ProductId == pro.Select(m=>m.ProductId));       
     }
     return View(product);
}

当前抛出以下异常

因为我试图用单个对象映射完整列表,所以“=”运算符不能应用于 int 到 IEnumerable。从逻辑上讲,我做错了什么,所以请帮助我 select 来自 IEnumerable 的当前 ID 并映射到当前的产品图片列表,最后创建可以在视图中显示的相同视图模型的集合。

您需要更改将 Product 的集合投影到 ProductViewModel 的集合并将 return 投影到视图的方法。

public ActionResult Pro()
{
    var pictures = db.ProductPictures;
    var model = db.Products.Select(p => new ProductViewModel
    {
        ProductName = p.ProductName,
        ProductDescription = p.ProductDescription,
        ....
        ProductPictures = pictures.Where(x => x.ProductId == p.ID)
    };
    return View(model);
}

然后在视图中

@model IEnmerable<ProductViewModel>
<table>
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(m => m.ProductName)</th>
            ....
        </tr>
    </thead>
    <tbody>
        @foreach(var product in Model)
        {
            <tr>
                <td>@Html.DisplayFor(m => product.ProductName)</td>
                ....

旁注:我建议您将方法的名称更改为 Index(),这意味着用户可以使用 .../Products 导航到它(假设您使用默认路由),或者至少表示您显示所有产品的名称(当前 url 将 ../Products/Pro 不会向用户传达任何有用的含义)