-1

リストをグループ化し、そのリストを表すモデルを構築し、ビュー内のテーブルに結果を表示するのに問題があります。例えば:

ご注文商品一覧

  1. 日にち
  2. 顧客ID
  3. 位置
  4. アイテム
  5. 価格

リストを場所ごとにグループ化する場合、そのリストをテーブルに正しくモデル化して表示するにはどうすればよいでしょうか? また、Location と CustomerId などの 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.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>    

このソリューションにより、途中で必要な行またはセルを再現するモデルを反復処理できるようになります。この問題で2日間ロシアンルーレットをしました。これにより、他の人が時間を節約できることを願っています。

于 2012-10-16T08:30:22.477 に答える