MVC,查看显示数据
嗨,我是asp新手,我想问你一些帮助。我用MvcMusicStore教程帮助建立了商店。现在我想添加一个视图来管理将只显示OrderID(在Index View中)的订单,然后在Details View中显示更多信息。信息将来自表看起来像这样:MVC,查看显示数据
当我列出的OrderID,其倍增,因为每个产品创建与表相同的OrderID新纪录。有没有什么办法只显示一次每个ID?
然后我试图在“详细视图”中显示更多信息,但我再次失败。我在控制器中使用此代码:
public ActionResult Details(int id)
{
var orderdetail = storeDB.OrderDetails.Single(a => a.Order.OrderId == id);
return View(orderdetail);
}
但显然它不会工作,因为只有一个元素可以显示。我也尝试使用Details.aspx中的foreach循环,但是我收到了一些IEnumerables相关的错误。欢迎任何建议,对新手问题和糟糕的英语感到抱歉。谢谢。
编辑:这是控制器的索引视图代码(产品在我的表等于专辑教程):
public ActionResult Index()
{
var manageorders = storeDB.OrderDetails
.Include("Product").Include("Order")
.ToList();
return View(manageorders);
}
和细节查看代码:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MasterPage.Master" Inherits="System.Web.Mvc.ViewPage<ss.Models.OrderDetail>" %>
指数
<div id="style3">manage orders</div>
<div id="style1">
<table>
<tr>
<th></th>
<th>
user
</th>
<th>
data
</th>
<th>
product
</th>
<th>
quantity
</th>
</tr>
<% foreach (var item in Model) { %>
<tr>
<td>
<%: Html.ActionLink("Edit", "Edit", new { id=item.Order.OrderId }) %> |
<%: Html.ActionLink("Details", "Delete", new { id=item.Order.OrderId })%>
</td>
<td>
<%: item.Order.Username %>
</td>
<td>
<%: item.Order.OrderDate %>
</td>
<td>
<%: item.Quantity %>
</td>
<td>
<%: item.Quantity %>
</td>
</tr>
<% } %>
<p>
<%: Html.ActionLink("Create New", "Create") %>
</p>
和错误,我recieving:
Compiler Error Message: CS1579: foreach statement cannot operate on variables of type 'ss.Models.OrderDetail' because 'ss.Models.OrderDetail' does not contain a public definition for 'GetEnumerator'
Single()
将抛出一个异常,如果有序列中超过1元,所以在这里的错误是因为每Order可以有很多OrderDetails(这是你的IEnumerable-ish错误)。如果您想选择第一个匹配项,那么当可能有多个匹配项时,使用First()方法,如果有多个匹配项,则该方法不会抛出。
这取决于你的控制器的工作 - Orders或OrderDetails。这将是Orders/Details/1
和OrderDetails/Details/1
之间的差异,其中第一个将关注整个订单及其所有细节,第二个将关注一个特定的行。
如果你想处理订单 - 它看起来像你要去的 - 那么你需要从订单到它的OrderDetails集合中的某种参考。如果您像使用MusicStore教程那样使用Entity Framework之类的东西,那么您将获得这个集合作为实体模型的一部分。您可以将订单传递给视图,然后可以访问每个或类似循环的a中的OrderDetails集合,例如
public ActionResult details(int id)
{
Order viewModel = storeDb.Orders.Single(o => o.Id = id);
return View(viewModel);
}
这不会抛出如果Id是唯一的每个订单,因为只有一个匹配(不是很多)。然后,您的观点可能有类似:
<ul>
<% foreach (OrderDetails od in Model.OrderDetails) { %>
<li><%: od.UnitPrice %> (Or whatever information you wanted to show) </li>
<% } %>
</ul>
我假设你会使用Order类型的强类型视图,否则你必须与ViewData的工作,但它从你的问题看起来像你”对这些概念已经足够满意了。
编辑 - 添加您的网页更多...
1.打字引起你一些问题,请确保你在你自己心里清楚你的模型是什么。如果您正在传递一个列表 - 就像您在索引操作中那样 - 您需要一个继承ViewPage>的页面(您可以在页面顶部的<%@ Page%>声明中看到这一点)。如果你打算编写像“for each ... in model”这样的代码,那就意味着你的模型必须包含一个以上的东西。这是您的“GetEnumerator”错误消息来自的地方。
您的视图张贴继承ViewPage,即该模型是一个单一的对象,而不是一个对象集合,所以“对于模型中的每个...”都没有明显的含义。您的视图的类型应该与您的控制器传递的类型相同。您的索引方法传递一个List,而List是一个IEnumerable的例子。但是,您的详细信息会传递一个YourModelClass。
2.错误消息“编译器错误消息:CS1061:'ss.Models.OrderDetail'不包含'OrderDetails'的定义” - 检查您的模型,如果表之间存在关系(外键等) ,它们应该在模型图中加入,并且通常也具有导航属性。你得到这个信息的事实意味着那里没有东西。
3.我认为可能值得查看一些视频,因为解释非常方便。试试http://www.asp.net/mvc/fundamentals的一些视频。乔·斯塔格纳的“对于我们其他人”系列都非常好,作为一个出发点,Stephen Walther的“创建电影数据库应用程序”将有所帮助,因为它显示了这种情况。
你能从你的视图(ASPX)发布代码吗?这可能会帮助我们诊断您所看到的IEnumerable错误。 – JMP 2011-02-04 19:58:29
你有链接到本教程吗? – Spooks 2011-02-04 20:09:38