【问题标题】:Querying Database MVC 4查询数据库 MVC 4
【发布时间】:2012-07-20 04:34:52
【问题描述】:

我正在从示例应用程序 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,看到的不是一个结果,而是三个不同专辑及其价格的列表。

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

【问题讨论】:

    标签: asp.net mysql sql asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我猜您希望 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);
    }
    

    编辑

    因为您现在将一个集合传递给视图,所以您需要遍历项目以呈现它。也就是说,实际上可能不只为Order 获取OrderDetails,而是获取Order 和.Include() 所有关联的OrderDetails,然后将图表传递给视图.我假设您已经在 Entity Framework 中设置了 Order 和 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>
    }
    

    【讨论】:

    • 感谢您更新您的回复。仍然有错误。然而,包括相关的订单详细信息正是我想要做的。
    • 有私下联系方式吗?我想向您发送 VS 解决方案,我可以通过 paypal 提前付款。我花了太多时间试图让它发挥作用。
    • @user1448260 发布你的项目,我会看看我能做什么。无需付款:)
    • 谢谢,今天下班后我会发一下!只是希望能够显示特定订单以及它的订单详细信息。它几乎 100% 是默认的 MVC 音乐商店解决方案,但带有一些额外的控制器。
    【解决方案2】:

    就 SQL 而言,这将是(我发明了字段名称)

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

    P1 是接受订单名称/编号的参数

    【讨论】:

    • 你知道用 LINQ 怎么做吗?
    【解决方案3】:

    公共 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) }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 2022-01-21
      • 2014-02-16
      • 1970-01-01
      相关资源
      最近更新 更多