2011-02-04 83 views
1

嗨,我是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'

+0

你能从你的视图(ASPX)发布代码吗?这可能会帮助我们诊断您所看到的IEnumerable错误。 – JMP 2011-02-04 19:58:29

+0

你有链接到本教程吗? – Spooks 2011-02-04 20:09:38

回答

0

Single()将抛出一个异常,如果有序列中超过1元,所以在这里的错误是因为每Order可以有很多OrderDetails(这是你的IEnumerable-ish错误)。如果您想选择第一个匹配项,那么当可能有多个匹配项时,使用First()方法,如果有多个匹配项,则该方法不会抛出。

这取决于你的控制器的工作 - Orders或OrderDetails。这将是Orders/Details/1OrderDetails/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的“创建电影数据库应用程序”将有所帮助,因为它显示了这种情况。