asp.net-mvc - 如何在 asp.net mvc 的同一个 foreach 中显示多个模型?
问题描述
当有多对多表时,如何在同一个foreach中显示多个模型?
有 3 个表 ( tblProduct, tblCustomer, tblOrder
)。tblOrder
&tblProduct
是多对多的,而tblCustomer
&tblOrder
是一对多的。
我想加入这 3 个表并显示与OrderNo
.
我首先使用了实体框架数据库(所以我没有多对多关系的中间表)。
请帮我 。我是 MVC 的新手。提前致谢。
这些是我的表:
Product
桌子:
public partial class tblProduct
{
[Key]
public int ProductId { get; set; }
public string UnitPrice { get; set; }
public virtual ICollection<tblOrder> tblOrders { get; set; }
}
Customer
桌子:
public partial class tblCustomer
{
[Key]
public int CustomerCode { get; set; }
public string CustomerName { get; set; }
public virtual ICollection<tblOrder> tblOrders { get; set; }
}
Order
桌子:
public partial class tblOrder
{
{
this.tblProducts = new HashSet<tblProduct>();
}
[Key]
public int OrderNo { get; set; }
public Nullable<int> Quantity { get; set; }
public Nullable<double> Discount { get; set; }
public Nullable<double> Total { get; set; }
public Nullable<double> SubTotal { get; set; }
public Nullable<double> DiscountTotal { get; set; }
public Nullable<double> Tax { get; set; }
public Nullable<double> NetTotal { get; set; }
public int CustomerCode { get; set; }
public virtual tblCustomer tblCustomer { get; set; }
public virtual ICollection<tblProduct> tblProducts { get; set; }
}
查看我创建的模型:
public class OrderCustomerProductViewModel
{
public int OrderNo { get; set; }
public string CustomerName { get; set; }
public int ProductId { get; set; }
public Nullable<int> Quantity { get; set; }
public string UnitPrice { get; set; }
public Nullable<double> Discount { get; set; }
public Nullable<double> Total { get; set; }
}
我试过这个,但我得到了一个错误:
public ActionResult Index(int id)
{
var results = (db.tblOrders.Where(l => l.OrderNo == id).Include(c => c.tblCustomer).Include(p => p.tblProducts)
.Select(v => new OrderCustomerProductViewModel
{
OrderNo = v.OrderNo,
CustomerName= v.tblCustomer.CustomerName,
ProductId = v.tblProducts.ProductId, <------ ERROR
Quantity = v.Quantity,
UnitPrice = v.tblProducts.UnitPrice, <------ ERROR
Discount = v.Discount,
Total = v.Total,
})).ToList();
return View(results);
}
这是我的View.cshtml
:
@foreach (var item in Model)
{
<tr id="rowtest">
<td height="100">@Html.DisplayFor(model => item.OrderNo)</td>
<td height="100">@Html.DisplayFor(model => item.CustomerName)</td>
<td height="100">@Html.DisplayFor(model => item.ProductId)</td>
<td height="100">@Html.DisplayFor(model => item.Quantity)</td>
<td height="100">@Html.DisplayFor(model => item.tblProductList.uni)</td>
<td height="100">@Html.DisplayFor(model => item.Discount)</td>
<td height="100">@Html.DisplayFor(model => item.Total)</td>
</tr>
}
我已将此添加到视图中:
@model IEnumerable<GridViewFuction.Models.ViewModel.OrderCustomerProductViewModel>
错误:ICollection 不包含 ProductId 和 UnitPrice 的定义
如果你能帮助我,那将是一个很大的帮助。
解决方案
您访问数据的方式是问题所在。下面的行
ProductId = v.tblProducts.ProductId
你在一侧有一个int
,在另一侧有一个List<int>
,所以它在UnitPrice
我不知道你想如何显示模型,但我会提供一些选项
使用您的模型以相同的方式使用
ProductId = v.tblProducts.First().ProductId
将您的模型更改为此
public class OrderCustomerProductViewModel
{
public int OrderNo { get; set; }
public string CustomerName { get; set; }
public List<int> ProductId { get; set; }
public Nullable<int> Quantity { get; set; }
public List<int> UnitPrice { get; set; }
public Nullable<double> Discount { get; set; }
public Nullable<double> Total { get; set; }
}
然后使用
ProductId = v.tblProducts.Select(m => m.ProductId).ToList()
所以你的结果现在看起来像:
var results = (tblOrders.Where(l => l.OrderNo == id)
.Select(v => new OrderCustomerProductViewModel
{
OrderNo = v.OrderNo,
CustomerName = v.tblCustomer.CustomerName,
ProductId = v.tblProducts.Select(m => m.ProductId).ToList(),
Quantity = v.Quantity,
UnitPrice = v.tblProducts.Select(m => m.UnitPrice).ToList(),
Discount = v.Discount,
Total = v.Total,
})).ToList();
我上面显示的是单个客户和客户的产品,但是如果你想显示单个客户的产品和价格,你必须
- 假设每个
Order
都有 aUnitPrice
和 aProduct
,首先获取产品的数量并在创建模型时循环遍历它。
编辑:
//first create a list of your view model
var resultList = new List<OrderCustomerProductViewModel>();
var results = tblOrders.Where(l => l.OrderNo == id).ToList();
//the above code can be var results = tblOrder.toList(); if you need all orders
//now loop through the results above
foreach (var order in results)
{
var products = order.tblProducts;
foreach (var product in products)
{
resultList.Add(new OrderCustomerProductViewModel
{
OrderNo = order.OrderNo,
CustomerName = order.tblCustomer.CustomerName,
ProductId = product.ProductId,
Quantity = order.Quantity,
UnitPrice = product.UnitPrice,
Discount = order.Discount,
Total = order.Total,
});
}
}
//then use the resultList
//NOTE that I went with the above assumption
- 有些
Orders
没有Product
and orUnitPrice
,获取 and 中计数最高的那个,Product
并将UnitPrice
计数用于循环。
我无法在这里编写整个代码。
推荐阅读
- java - 我正在阅读“Java 编程和数据结构简介”一书,在解释类抽象和封装的章节中,它说:
- node.js - 如何在 Mongoose 中正确格式化 API 响应?
- javascript - 做一些freecodecamp问题,我遇到了一个指导对象值的小问题
- graphql - 阿波罗,Next.js,Strapi,GraphQL 错误'
. ' 在方案或关系中找不到 - javascript - Javascript从电报中保存用户名
- javascript - 在angularJs的自定义指令中观察错误抛出错误
- vue.js - Safari 上未显示 Vuetify mdi 图标
- javascript - 如何在反应中将道具传递给多级组件?
- javascript - 脚本未从外部文件加载 css 属性
- postgresql - PostgreSQL Group By 查询结果不显示组值,只显示列名