2012-07-20 129 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) }