2

ビューの詳細行に加えて、「カウント」や「合計」などの集計データを表示したいと考えています。ピッキング リスト テーブルがあり、SKU 別に整理されたリスト ラインの表示とは別に、SKU ごとの合計を表示したいと考えています。

私の PickingList モデルは次のようになります。

public partial class PickingList
{
    public int Id { get; set; }
    [ForeignKey("List_Header")]
    public int TransID { get; set; }
    public string SKU { get; set; }
    public int ColorId { get; set; }
    public double Qty { get; set; }
    public decimal Price { get; set; }

    public virtual List_Header List_Header { get; set; }
}

TransID をリストに渡すコントローラーは次のとおりです。

    public ActionResult ListShipment(int transid)
    {
        var mylist = db.PickingLists.Where(p => p.TransID == transid);
        mylist = mylist.OrderBy(p => p.Id);
        return View(mylist.ToList());
    }

そして、最後に、私が達成したいのは次のようなものです:

SKU           Qty              Color

61009         12 pieces
               3               Blue
               5               Red
               4               Green

61011         10 pieces
               6               Blue
               4               Red

次の View コード ブロックを試しましたが、集計 (合計) 関数を配置する場所がわかりません。

@foreach (var group in Model.GroupBy(item => item.SKU))
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => group.Key)
                        </td>
                   </tr>
                    foreach (var item in group.OrderBy(o => o.Id))
                    {
                        <tr>
                            <td></td>
                            <td>
                                @Html.DisplayFor(modelItem => item.Qty)
                            </td>
                            .........
                            .........
                            .........

どうすればそれを達成できますか?

4

2 に答える 2

0

あなたの要件を完全に理解したかどうかはわかりませんが、クライアント側で受け取ったデータに対していくつかの集計を実行しようとしていると思います. その場合は使用できます

Linqjs

これは非常に優れており、クライアント側のコードで .Net メソッドを使用できるようになります。

もう 1 つの方法は、ViewModel を定義し、QtySum および LineCount プロパティを追加することです。サーバー側のコードでそれを計算し、ViewModel をクライアントに返します。クライアント側のコードは、これらの値を使用して UI をレンダリングします。

更新 1:

達成したいことに関する詳細情報を見ると、ViewModel アプローチの定義に間違いなく行きたいと確信しています。私はサーバー側のコードを書いていて、すべての機能 (.net メソッド) を持っているので、より多くの制御ができるので、それを好みます。2 つ目は、ビューをできるだけ馬鹿げた軽量なものにすることです。

現在のシナリオでは、ビュー モデルを以下のように定義します (この例を参考にして、必要に応じて変更してください)。

public class PickingListViewModel
{
    public int Id { get; set; }
    public int TransID { get; set; }
    public PickingListSkuViewModel SkuGroupModel { get; set; }
}

public class PickingListSkuViewModel
{
    public string SKU { get; set; }
    public IEnumerable<PickingListItemViewModel> GroupItems { get; set; }
}

public class PickingListItemViewModel
{
    public int ColorId { get; set; }
    public string Color { get; set; }
    public double Qty { get; set; }
    public decimal Price { get; set; }
}

コントローラーで、次のようにビュー モデルを埋めることができます (ビジネスまたはデータ レイヤーからデータをフェッチすることをお勧めする方法であることに注意してください)。

public ActionResult Index()
{
    ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

    // Read this data from business layer
    var group1 = new PickingListSkuViewModel
    {
        SKU = "61009",
        GroupItems = new List<PickingListItemViewModel>
        {
            new PickingListItemViewModel
            {
                Color = "Blue",
                Qty = 12,
                Price = (decimal) 2.5
            },
            new PickingListItemViewModel
            {
                Color = "Red",
                Qty = 3,
                Price = (decimal) 4.5
            }
            ,
            new PickingListItemViewModel
            {
                Color = "Green",
                Qty = 4,
                Price = (decimal) 1.5
            }
        }
    };

    var group2 = new PickingListSkuViewModel
    {
        SKU = "61011",
        GroupItems = new List<PickingListItemViewModel>
        {
            new PickingListItemViewModel
            {
                Color = "Blue",
                Qty = 12,
                Price = (decimal) 2.5
            },
            new PickingListItemViewModel
            {
                Color = "Red",
                Qty = 3,
                Price = (decimal) 4.5
            }
            ,
            new PickingListItemViewModel
            {
                Color = "Green",
                Qty = 4,
                Price = (decimal) 1.5
            }
        }
    };

    var model = new List<PickingListViewModel>
    {
        new PickingListViewModel
        {
            Id = 1,
            TransID = 101,
            SkuGroupModel = group1
        },
        new PickingListViewModel
        {
            Id = 2,
            TransID = 102,
            SkuGroupModel = group2
        }
    };

    return View(model);
}

コントローラーはモデルを初期化し、適切なビューに戻すだけです。

あなたがそれに慣れていると信じているので、私はビューコードを含めていません。ヒントとして、グループごとにすべての情報を取得したので、レンダリング コードを記述します。合計またはカウント、またはその他の集計をビューコードに追加しPickingListItemViewModelたり、単純な計算をビューコードで実行したりできます。たとえば、TotalPrice = Quantity * Price

追加の質問があればお知らせください。お役に立てれば。

于 2014-04-28T05:39:07.043 に答える
0

SBirthare が示唆しているように、おそらくビュー モデルを作成し、そこに作業の一部を移動する必要があると思います。ただし、質問に答えるために、次の情報を探している可能性があります。

<tr>
  <td>
    @Html.DisplayFor(modelItem => group.Key)
  </td>
  <td>
    @Html.DisplayFor(modelItem => group.Sum(item => item.Qty))
    <span> pieces</span>
  </td>
</tr>

あなたの質問を誤解している場合は、お知らせください。

于 2014-04-29T18:56:39.047 に答える