首页 > 解决方案 > 如何在 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 的定义

如果你能帮助我,那将是一个很大的帮助。

标签: asp.net-mvcentity-frameworkforeachmany-to-manyjointable

解决方案


您访问数据的方式是问题所在。下面的行

 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();

我上面显示的是单个客户和客户的产品,但是如果你想显示单个客户的产品和价格,你必须

  1. 假设每个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
  1. 有些Orders没有Productand orUnitPrice,获取 and 中计数最高的那个,Product并将UnitPrice计数用于循环。

我无法在这里编写整个代码。


推荐阅读