在视图中分组和显示模型

时间:2012-10-15 10:49:36

标签: c# asp.net-mvc

我在分组列表时遇到问题,然后构建一个表示该列表并在视图中的表中显示结果的模型。例如:

订购的商品清单

  1. 日期
  2. 客户ID
  3. 位置
  4. 项目
  5. 价格
  6. 数量
  7. 如果我想按位置对列表进行分组,如何在表格中正确建模和显示该列表?如果我想通过两个属性对列表进行分组,例如Location和CustomerId?

    ,该怎么办?

    这是我的模特:

    public class ViewInvoice
    {
    public string ClientLocation { get; set; }
    public List<DetailsGroup> Details { get; set; }
    
    public class DetailsGroup
    {
        public List<string> Product { get; set; }
        public List<string> ProductSize { get; set; }
        public List<string> PackageType { get; set; }
        public List<DateTime> OrderDate { get; set; }
        public List<DateTime> DeliveryDate { get; set; }
        public List<int> OrderNumber { get; set; }
        public List<decimal> Price { get; set; }
        public List<int> ItemQuantity { get; set; }
    }
    }   
    

    我正在尝试在剃刀视图中的表格中显示此模型。这是代码:

    @using MyModel.MyTools.Orders.SumOrder
    @model SumOrder
    
    @{
    ViewBag.Title = "View Invoice";
    }
    
    <h2>View Invoice</h2>
    
    <table>
        @foreach(var prod in Model.OCI)
        {
            <tr>
                <td>
                    @prod.ClientLocation
                </td>
            </tr>
             foreach (var orderItem in prod.Details)
            {
                <tr>
                    <td>
                        @orderItem.Product
                    </td>
                    <td>
                        @orderItem.ItemQuantity
                    </td>
                </tr>
            }
        }
    </table>
    

    表格中的第一行显示正确,这是一个城市的名称,但在下一行中我得到了这个:

    System.Collections.Generic.List1 [System.String] System.Collections.Generic.List1 [System.Int32]

    有人可以向我解释为什么我不能以可读格式返回列表,以及如何解决这个问题?

    以下是我用于对ViewInvoice模型列表进行分组的代码:

    public SumOrder(List<orders_Cart> order)
        {
            // create list of order cart item
            List<OrderCartItems> cartItems = new List<OrderCartItems>();
    
            // convert orders to ocm
            foreach(var item in order)
            {
                var newCartItem = new OrderCartItems();
                try
                {
                    newCartItem.Product = db.product_Product.FirstOrDefault(p =>
                        p.Id == item.ProductId).ProductDescription ?? "none";
                }
                catch (Exception)
                {
    
                    newCartItem.Product = "none";
                }
                try
                {
                    newCartItem.ClientForProduct = MyTool.OrdersFindClientLocation(
                        (int) item.ClientForOrdersId);
                }
                catch (Exception)
                {
    
                    newCartItem.ClientForProduct = new object[3];
                }
                try
                {
                    newCartItem.ProductSize = db.products_Size.FirstOrDefault(p => p.Id ==
                        item.ProductSizeId).ProductSizeCode ?? "none";
                }
                catch (Exception)
                {
    
                    newCartItem.ProductSize = "none";
                }
                try
                {
                    newCartItem.PackageType = db.packaging_PackageType.FirstOrDefault(p =>
                        p.Id == item.PackageTypeId).PackageTypeCode ?? "none";
                }
                catch (Exception)
                {
    
                    newCartItem.PackageType = "none";
                }
                newCartItem.OrderDate = (DateTime) item.OrderDate;
                newCartItem.DeliveryDate = (DateTime) item.DeliveryDate;
                newCartItem.OrderNumber = (int) item.OrderNumber;
                newCartItem.Price = (decimal) item.Price;
                newCartItem.ClientLocation = MyTool.OrdersFindClientLocation(
                    (int) item.ClientForOrdersId, null);
                newCartItem.ItemQuantity = (int) item.Quantity;
                cartItems.Add(newCartItem);
            }
    
            // group the cartItems according to location
            List<ViewInvoice> ordersGrouped = cartItems.GroupBy(c => new 
                {c.ClientLocation})
                .OrderBy(c => c.Key.ClientLocation).Select(s =>
                    new ViewInvoice()
                        {
                            ClientLocation = s.Key.ClientLocation,
                            Details = new List<ViewInvoice.DetailsGroup>()
                                {
                                    new ViewInvoice.DetailsGroup()
                                        {
                                            Product = s.Select(p => p.Product).ToList(),
                                            ItemQuantity = s.Select(p => p.ItemQuantity).ToList(),
                                            DeliveryDate = s.Select(p => p.DeliveryDate).ToList(),
                                            OrderDate = s.Select(p => p.OrderDate).ToList(),
                                            OrderNumber = s.Select(p => p.OrderNumber).ToList(),
                                            PackageType = s.Select(p => p.PackageType).ToList(),
                                            Price = s.Select(p => p.Price).ToList(),
                                            ProductSize = s.Select(p => p.ProductSize).ToList()
                                        }
    
                                }
    
                        }).ToList();
    
            // set the OCI property
            OCI = ordersGrouped;
        };
    

1 个答案:

答案 0 :(得分:0)

好的,我终于解决了我的问题。我最初过度思考了这个问题。我简化了我的模型,并为我的观点添加了一些简单的逻辑。

以下是更新后的模型:

public class ViewInvoice
{
    public string ClientLocation { get; set; }
    public List<string> Product { get; set; }
    public List<string> ProductSize { get; set; }
    public List<string> PackageType { get; set; }
    public List<DateTime> OrderDate { get; set; }
    public List<DateTime> DeliveryDate { get; set; }
    public List<int> OrderNumber { get; set; }
    public List<decimal> Price { get; set; }
    public List<int> ItemQuantity { get; set; }
}

用于对模型列表进行分组的更新代码:

// group the cartItems according to location
        List<ViewInvoice> ordersGrouped = cartItems.GroupBy(c => new 
            {c.ClientLocation})
            .OrderBy(c => c.Key.ClientLocation).Select(s =>
                new ViewInvoice()
                    {
                        ClientLocation = s.Key.ClientLocation,
                        Product = s.Select(p => p.Product).ToList(),
                        ItemQuantity = s.Select(p => p.ItemQuantity).ToList(),
                        DeliveryDate = s.Select(p => p.DeliveryDate).ToList(),
                        OrderDate = s.Select(p => p.OrderDate).ToList(),
                        OrderNumber = s.Select(p => p.OrderNumber).ToList(),
                        PackageType = s.Select(p => p.PackageType).ToList(),
                        Price = s.Select(p => p.Price).ToList(),
                        ProductSize = s.Select(p => p.ProductSize).ToList()

                    }).ToList();

和更新后的观点:

@using MyModel.MyTools.Orders.SumOrder
@model SumOrder

@{
    ViewBag.Title = "View Invoice";
}

<h2>View Invoice</h2>
@{
    int i = 0;
}
<table>
    @foreach(var mod in Model.OCI)
    {
        var modCount = @mod.Product.Count();
        <tr>
            <th>@mod.ClientLocation</th>
        </tr>
        <tr>
            <th>Product</th>
            <th>Price</th>
        </tr>
        foreach (var items in mod.Product)
        {
            <tr>
                <td>
                    @mod.Product.ElementAtOrDefault(i)
                </td>
                <td>
                    @mod.Price.ElementAtOrDefault(i)
                </td>
            </tr>
            i++;
        }

    }
</table>    

这个解决方案显然允许我遍历模型,沿途重现任何所需的行或单元格。在这个问题上玩了两天的俄罗斯轮盘赌。希望这能节省一些其他时间。