2012-07-20 102 views
0

我正在從示例應用程序MVC音樂商店學習MVC。它有兩個數據庫表,一個叫'Order'和另一個'OrderDetails'。如果訂單已完成並且客戶選擇了多個商品,則在結帳後,每件商品都將在OrderDetails數據庫中創建一個新行,並且OrderDetailsID將遞增。查詢數據庫MVC 4

該數據庫的OrderDetail看起來像:

http://imagebin.org/221494 

我想寫一個控制器,將只通過其具有相同的特定的OrderId所有行。例如,在該數據庫中有3行,每行都具有相同的OrderId'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的單個結果,而不是幾個結果全都具有相同的OrderId。我應該能夠訪問....:11091/orderdetails/Details/3並且看不到一個結果,而是看到三個不同的相冊及其價格的列表。

有沒有簡單的方法來做到這一點?謝謝你的建議。

回答

0

在SQL而言,這將是(我已經發明瞭字段名)

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

P1是會接受訂單的名稱/編號

+0

你知道怎麼用LINQ來做嗎? – user1448260 2012-07-20 04:46:21

3

我猜你想要的參數LINQ查詢來做到這一點。

原來的答覆(只是的OrderItems)

以下就足夠了,但請注意,你需要你的剃鬚刀視圖模型類型更改從OrderDetailIList<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); 
} 

編輯

因爲你現在通過收集到的觀點,您需要通過項目迭代來呈現它。這就是說,它實際上可能意義不爲Order只是OrderDetails取,而是取Order.Include()所有相關OrderDetails,然後將圖形傳遞給視圖。我假設你已經在實體框架中建立了OrderOrderDetails之間的關係。

控制器

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); 
} 

查看(注意到OrderOrderDetails已經躍躍欲試加載)

@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> 
} 
+0

我得到一個錯誤將發佈我的剃鬚刀代碼波紋管。 – user1448260 2012-07-20 06:11:18

+0

感謝您更新您的回覆。仍然有一個錯誤。然而,包括相關的orderdetails正是我想要做的。 – user1448260 2012-07-22 04:29:15

+0

你有辦法私下與你聯繫嗎?我想寄給你VS解決方案,我可以通過paypal提前付款。我花了太多時間試圖讓這個工作。 – user1448260 2012-07-22 04:38:52

0

公衆的ActionResult詳細信息(INT ID = 0)

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

在你看來...

根據你的實體。視圖將使用@model列表

然後迭代thorugh列表:

@foreach(VAR i的模型){ Html.DisplayFor(X => i.Name) }

或只是YourProject.Model.xxx

@foreach(VAR i的Model.YourList){ Html.DisplayFor(X => i.Name) }