如何在 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
不会向用户传达任何有用的含义)
我正在尝试在我的 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
不会向用户传达任何有用的含义)