如何从ViewBag打印列表

时间:2018-06-05 08:33:59

标签: c# asp.net-mvc list access viewbag

我想在视图中打印产品详细信息以及类别名称。我使用了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'的定义 请指正。非常感谢你

1 个答案:

答案 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
}