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>    

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

于 2012-10-16T08:33:24.473 に答える
1

モデル オブジェクトは意味がありません。Price や Quantity などの各プロパティがコレクションになっているのはなぜですか? 1 つの注文品目オブジェクトは、コレクションではなく、プロパティごとに 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 に答える