-1

我无法对列表进行分组,然后构建一个表示该列表的模型并将结果显示在视图中的表中。例如:

订购物品清单

  1. 日期
  2. 客户ID
  3. 地点
  4. 物品
  5. 价格
  6. 数量

如果我想按位置对列表进行分组,我将如何正确建模并在表格中显示该列表?如果我想按两个属性(例如 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;
    };
4

1 回答 1

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>    

该解决方案清楚地允许我遍历模型,沿途复制任何所需的行或单元格。为这个问题玩了两天的俄罗斯轮盘赌。希望这可以节省其他一些时间。

于 2012-10-16T08:30:22.477 回答