我想在视图中打印产品详细信息以及类别名称。我使用了ViewBag。 如何在视图中访问或打印它 以下是域类和上下文类
public partial class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public string Description { get; set; }
public byte[] Picture { get; set; }
}
public partial class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public Nullable<int> SupplierID { get; set; }
public Nullable<int> CategoryID { get; set; }
}
,Action方法
public ActionResult Products()
{
var productList = (from p in db.Products
join c in db.Categories
on p.CategoryID equals c.CategoryID
select new { ProductID=p.ProductID, ProductName=p.ProductName, CategoryName =c.CategoryName }).ToList();
ViewBag.ProductsList = productList;
return View();
}
并且视图Products.cshtml
<table border="1" cellpadding="1" cellspacing="1" style="border:dotted">
<thead>
<tr>
<th>Produdt Id</th>
<th>Name</th>
<th>Category</th>
</tr>
</thead>
<tbody>
@foreach(var item in ViewBag.ProductsList)
{
<tr>
<td>@item.ProductID</td>
<td>@item.ProductName</td>
<td>@item.CategoryName</td>
</tr>
}
</tbody>
返回异常。
异常详细信息:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:
'object'不包含'ProductID'的定义
请指正。非常感谢你
答案 0 :(得分:1)
正如bommelding所指出的那样,你应该尽量避免使用ViewBag并使用强类型的ViewModels。
话虽这么说,你的问题是ViewBag基本上是IDictionary<string, object>
。因此,如果您访问ViewBag["ProductsList"]
,则会收到object
,因此会收到错误
&#39;对象&#39;不包含&#39; ProductID&#39;
的定义
您需要将此object
强制转换为原始类型才能访问这些属性。但是你没有要转换的原始类型,因为你首先使用匿名类型来填充ViewBag。
干净的解决方案是引入ViewModels:
public class ProductViewModel {
public int ProductID { get; set; }
public string ProductName { get; set; }
public string CategoryName { get; set; }
}
public class ProductsPageViewModel {
public ProductsPageViewModel {
ProductsList = new List<ProductViewModel>();
}
public ICollection<ProductViewModel> ProductsList { get; set; }
}
将ViewModel传递给Controller中的View:
public ActionResult Products() {
var productList =
(from p in db.Products
join c in db.Categories
on p.CategoryID equals c.CategoryID
select new ProductViewModel {
ProductID = p.ProductID,
ProductName = p.ProductName,
CategoryName = c.CategoryName
}).ToList();
var viewModel = new ProductsPageViewModel {
ProductsList = productList
};
return View("Products", viewModel);
}
在Products.cshtml视图中,使用@model
指令定义您期望的ViewModel:
@model ProductsPageViewModel
@* ... *@
@foreach (var item in Model.ProductsList) {
@item.ProductID
}