我正在从样例应用程序MVC音乐商店学习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,看到的不是一个结果,而是三张不同专辑及其价格的列表。
有没有简单的方法可以做到这一点?谢谢你的建议。
发布于 2012-07-20 12:48:52
我猜您希望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,然后将图形传递给视图,这实际上可能是有意义的。我假设您已经在实体框架中设置了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);
}视图(获取已预先加载OrderDetails的Order )
@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-20 12:38:22
在SQL方面,这将是(我发明了字段名)
select orderdetails.title, orderdetails.quant
from orderdetails inner join orders
on orderdetails.ord = orders.ord
where orders.ordname = :p1P1是一个接受订单名称/编号的参数
发布于 2013-02-15 20:00:44
公共ActionResult详细信息(int id = 0)
{ OrderDetail orderdetail = db.OrderDetails.Where(o => o.Id == id).ToList();if (orderdetail == null) { return HttpNotFound();}返回视图(Orderdetail);}
在你看来...
这取决于你的实体。您的视图将使用@model List
然后遍历列表:
@foreach(模型中的变量i){ Html.DisplayFor(x => i.Name) }
或者仅仅是YourProject.Model.xxx
@foreach(Model.YourList中的var i){ Html.DisplayFor(x => i.Name) }
https://stackoverflow.com/questions/11572953
复制相似问题