0

サンプルアプリMVC Music StoreからMVCを学んでいます。2 つのデータベース テーブルがあり、1 つは「Order」と呼ばれ、もう 1 つは「OrderDetails」です。注文が行われ、顧客が複数のアイテムを選択した場合、チェックアウト後に、購入した各アイテムが OrderDetails データベースに新しい行を作成し、OrderDetailsID が増加します。

OrderDetail データベースは次のようになります。

http://imagebin.org/221494

同じ特定の OrderId を持つすべての行を渡すだけのコントローラーを作成したいと考えています。たとえば、そのデータベースには、それぞれ同じ OrderId '3' を持つ 3 つの行があります。

どうすればこれを実行してかみそりビューに渡すことができますか? 私はもう試した:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcMusicStore.Models;

namespace Test.Controllers
{
public class OrderDetailsController : Controller
{
    private MusicStoreEntities db = new MusicStoreEntities();

          //
    // GET: /OrderDetails/Details/5

    public ActionResult Details(int id = 0)
    {
        OrderDetail orderdetail = db.OrderDetails.Find(id);
        if (orderdetail == null)
        {
            return HttpNotFound();
        }
        return View(orderdetail);
    }

これにより、OrderDetailsId に基づいて 1 つの結果が返され、同じ OrderId を持つ複数の結果は返されません。....:11091/orderdetails/Details/3 にアクセスして、1 つの結果ではなく、3 つの異なるアルバムとその価格のリストを確認できるはずです。

これを行う簡単な方法はありますか?アドバイスをありがとう。

4

3 に答える 3

3

LINQ クエリでこれを行う必要があると思います。

元の回答(OrderItemsのみ)

OrderDetail以下で十分ですが、カミソリ ビューのモデル タイプを からに変更する必要があることに注意してくださいIList<OrderDetail>

public ActionResult Details(int id = 0)
{
    var orderdetails = db.OrderDetails.Where(od => od.OrderId == id).ToList();
    if ((orderdetails == null) || (!orderdetails.Any()))
    {
        return HttpNotFound();
    }
    return View(orderdetails);
}

編集

コレクションをビューに渡しているため、アイテムを反復処理してレンダリングする必要があります。とは言っても、OrderDetailsforだけを取得するのOrderではなく、関連するすべての をOrder取得してから、グラフをビューに渡すことは実際には理にかなっているかもしれません。Entity Frameworkでとの関係を設定したとします。.Include()OrderDetailsOrderOrderDetails

コントローラ

public ActionResult Details(int id = 0)
{
    var orderWithDetails = db.Orders
                             .Include(o => o.OrderDetails)
                             .FirstOrDefault(o => o.OrderId == id);
    if (orderWithDetails == null)
    {
        return HttpNotFound();
    }
    return View(orderWithDetails);
}

ビュー (すでに熱心に読み込まれているOrderものを使用)OrderDetails

@model MvcMusicStore.Models.Order

... 注文レベル フィールドをここに表示

<div class="display-label">
   @Html.DisplayNameFor(model => model.Username)
</div>
<div class="display-field">
  @Html.DisplayFor(model => model.Username)
</div>

... テーブルやグリッドなど、ここに OrderDetail レベルのフィールドを表示します

@foreach (var orderItem in model.OrderDetails) {

  <div class="display-label">
       @Html.DisplayNameFor(orderItem => orderItem.OrderItemField1)
  </div>
  <div class="display-field">
      @Html.DisplayFor(orderItem => orderItem.OrderItemField1)
  </div>
}
于 2012-07-20T04:48:52.097 に答える
0

SQLに関しては、これは(フィールド名を発明しました)

select orderdetails.title, orderdetails.quant
from orderdetails inner join orders
on orderdetails.ord = orders.ord
where orders.ordname = :p1

P1 は、注文の名前/番号を受け入れるパラメーターです。

于 2012-07-20T04:38:22.090 に答える
0

公開アクション結果の詳細 (int id = 0)

{
    OrderDetail orderdetail = db.OrderDetails.Where(o => o.Id == id).ToList();
    if (orderdetail == null)
    {
        return HttpNotFound();
    }
    return View(orderdetail);
}

あなたの見解では...

あなたのエンティティに応じて。ビューは @model List を使用します

次に、リスト全体を繰り返します。

@foreach(var i in Model) { Html.DisplayFor(x => i.Name) }

または単に YourProject.Model.xxx

@foreach(Model.YourList の変数 i) { Html.DisplayFor(x => i.Name) }

于 2013-02-15T12:00:44.480 に答える