2

这是我的模型:

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.List 1[System.String] System.Collections.Generic.List1[System.Int32]

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

这是我用来对 ViewInvoice 模型的列表进行分组的代码:

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

3 回答 3

2

好的,我终于解决了我的问题。我一开始是过度思考这个问题。我简化了我的模型,并在我的视图中添加了一些简单的逻辑。

这是更新的模型:

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:33:24.473 回答
1

您的模型对象没有任何意义。为什么您的每个属性(例如价格和数量)都是一个集合?单个订单行项目对象的每个属性只有一个值,而不是集合。您的发票对象已经考虑了多个详细信息对象,但单个详细信息对象不应将其属性作为列表。从您的所有属性中删除 List<> ,它应该可以解决它。

于 2012-10-15T02:36:18.197 回答
0

因为字符串列表与字符串不同。您看到的是 List 类的 ToString() 方法返回的默认值。

要以逗号分隔的显示方式从列表中获取元素,请使用:

string.Join(",", orderItem.Product.ToArray())
string.Join(",", orderItem.ItemQuantity.ToArray())

每当您要打印某些内容时,都会调用该对象的 ToString() 方法。在 List<> 类上定义的这个 ToString() 方法无法知道您希望如何显示您的数据,看看列表如何可以包含多个 String 或 int 或 Date。例如,您可能希望在每个值前面添加一个 <p> 并在每个值之后添加一个 </p>。

第一行显示正确,因为 ClientLocation 是一个简单类型。有关简单类型的更多信息,请参阅简单类型

于 2012-10-15T02:35:56.180 回答