我是.Net MVC的新手,我正在努力解决以下问题。
我的模型包含两个我希望在一个页面上显示的表格。表格是产品和供应商。
我创建了一个ViewModel,它包含两个枚举表。
在Controller中,我创建了一个包含数据的List对象。
我遇到的问题是在我需要 item.Product.ID
时定义视图中的字段,即仅 item.Product 可用请参阅下面的代码:
Product.cs - 由实体框架生成
namespace MyApp
{
using System;
using System.Collections.Generic;
public partial class Product
{
public Product()
{
this.Suppliers = new HashSet<Supplier>();
}
public int ID { get; set; }
public string title { get; set; }
public string img { get; set; }
public string description { get; set; }
public virtual ICollection<Supplier> Suppliers { get; set; }
}
}
Supplier.cs - 由实体框架生成
namespace MyApp
{
using System;
using System.Collections.Generic;
public partial class Supplier
{
public int ID { get; set; }
public string name { get; set; }
public int productID { get; set; }
public decimal price { get; set; }
public virtual Product Product { get; set; }
}
}
ProductWithSupplier.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
namespace MyApp
{
public class ProductWithSupplier
{
public IEnumerable<Product> Products { get; set; }
public IEnumerable<Supplier> Suppliers { get; set; }
}
}
HomeController.cs
public ActionResult Index()
{
var p = from product in _db.Products
select product;
var s = from supplier in _db.Suppliers
select supplier;
var model = new List<MyApp.ProductWithSupplier> { new ProductWithSupplier()
{
Products = p,
Suppliers = s
}
};
return View(model);
}
Index.cshtml - 这就是问题所在。我无法指定Product.ID,Product.title,Product.img,Product.price和Supplier.name
@model List<MyApp.ProductWithSupplier>
@{
ViewBag.Title = "Home Page";
}
@foreach (var item in Model) {
<div class="product @Html.Raw(item.Products.size)">
<div class="media">
<a href="product.html" title="product title">
<img src="@Html.Raw(item.Products.img)" alt="product title" data-img="product-1" />
</a>
</div>
<div class="details">
<p class="name"><a href="product.html">@Html.Raw(item.Products.title)</a></p>
<p class="price"><span class="cur">£</span><span class="total">@Html.Raw(item.Products.price)</span></p>
</div>
<div class="details-supplier" id="details-@Html.Raw(item.Products.ID)">
@foreach (var supplier in Model) {
<p>@supplier.Suppliers.name</p>
}
</div>
</div>
}
提前致谢!
答案 0 :(得分:0)
视图模型的类型为List<MyApp.ProductWithSupplier>
,但在单个ProductWithSupplier
内,您定义了Product
和Supplier
的集合。我想你想使用ProductWithSupplier
作为视图的模型,并遍历产品和供应商。
@model ProductWithSupplier
ViewModel应包含一个产品,其中包含多个供应商来表示您的数据结构:
public class ProductWithSupplier // this should be ProductWithSuppliers I guess.
{
public Product Products { get; set; }
public IEnumerable<Supplier> Suppliers { get; set; }
}
您必须相应地更改控制器。
也可以使用IEnumerable<Supplier>
作为视图的模型,迭代它们并使用Product
上的Supplier
导航属性来获取有关该产品的信息。
答案 1 :(得分:0)
使用下面的东西,我没有尝试过,但同样的情感为我工作
@model IEnumerable<MyApp.Supplier>
,您将能够访问product.item,product.id等
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Products.id) // to access properties of products
</td>
<td>
@Html.DisplayFor(modelItem => item.Name) // to access properties of suppliers
</td>
</tr>
}
答案 2 :(得分:0)
您在ProductWithSupplier中定义了两个IEnumerable
,因此当您遍历List<ProductWithSupplier>
时,每个item
类型ProductWithSupplier
包含两个枚举,您就不能使用item.Products.title
,因为item.Products
的类型为IEnumerable<Product>
。
您应该做的是在第一个foreach
内添加var
,检查供应商.ProductID,添加类型而不是@model List<MyApp.ProductWithSupplier>
@{
ViewBag.Title = "Home Page";
}
@foreach (MyApp.ProductWithSupplier item in Model)
{
@foreach (Product product in item.Products)
{
<div class="product @Html.Raw(item.Products.size)">
<div class="media">
<a href="product.html" title="product title">
<img src="@Html.Raw(item.Products.img)" alt="product title" data-img="product-1" />
</a>
</div>
<div class="details">
<p class="name"><a href="product.html">@Html.Raw(item.Products.title)</a></p>
<p class="price"><span class="cur">£</span><span class="total">@Html.Raw(item.Products.price)</span></p>
</div>
<div class="details-supplier" id="details-@Html.Raw(item.Products.ID)">
@foreach (Supplier supplier in item.Suppliers)
{
@if (supplier.productID == product.ID)
{
<p>@supplier.name</p>
}
}
</div>
</div>
}
}
,依此类推:
Product
如果您只需要一个ProductWithSupplier
,请更改IEnumerable<>
以删除产品周围的foreach
,然后直接使用item.Product
删除第二个{{1}}。< / p>