0

我正在从示例应用程序 MVC Music Store 学习 MVC。它有两个数据库表,一个称为“Order”,另一个称为“OrderDetails”。如果下订单并且客户选择了多个商品,则在结账后,购买的每件商品都会在 OrderDetails 数据库中创建一个新行,并且 OrderDetailsID 将增加。

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,看到的不是一个结果,而是三个不同专辑及其价格的列表。

有没有一种简单的方法可以做到这一点?谢谢你的建议。

4

3 回答 3

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

编辑

因为您现在将集合传递给视图,所以您需要遍历项目以呈现它。也就是说,实际上可能不只获取OrderDetailsfor an Order,而是获取 theOrder.Include()所有关联的OrderDetails,然后将图形传递给视图。我假设您已经在 Entity FrameworkOrder之间建立了关系。OrderDetails

控制器

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

公共 ActionResult 详细信息(int id = 0)

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

在你看来...

取决于您的实体。您的视图将使用 @model 列表

然后遍历列表:

@foreach(模型中的变量 i) { Html.DisplayFor(x => i.Name) }

或者只是 YourProject.Model.xxx

@foreach(Model.YourList 中的变量 i){ Html.DisplayFor(x => i.Name) }

于 2013-02-15T12:00:44.480 回答