MVC,查看显示数据

时间:2011-02-04 19:53:40

标签: c# asp.net-mvc-2

嘿,我是asp的新手,我想请你帮忙。我用MvcMusicStore教程帮助构建了商店。现在我想添加一个View来管理只显示OrderID的订单(在Index View中),然后在Details View中显示更多信息。信息将来自表格,如下所示:

当我列出OrderID时,它会相乘,因为每个产品都会在表中创建具有相同OrderID的新记录。有没有办法只显示一次ID?

然后我尝试在Detaild View中显示更多信息,但我又失败了。我在Controller中使用了这段代码:

        public ActionResult Details(int id)
    {
        var orderdetail = storeDB.OrderDetails.Single(a => a.Order.OrderId == id);
        return View(orderdetail);
    }

但很明显它不会起作用,因为只能显示一个元素。我也尝试过在Details.aspx中使用foreach循环但是我得到了一些与IEnumerables相关的错误。欢迎任何建议,抱歉新手问题和糟糕的英语。谢谢。

编辑:这是Controller的Index View代码(我的表中的产品等于教程中的Album):

        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>

我收到的错误:

  

编译器错误消息:CS1579:foreach语句无法对类型为'ss.Models.OrderDetail'的变量进行操作,因为'ss.Models.OrderDetail'不包含'GetEnumerator'的公共定义

1 个答案:

答案 0 :(得分:0)

如果序列中有多个元素,

Single()将抛出异常,因此这里的错误是因为每个Order可以有许多OrderDetails(这是你的IEnumerable-ish错误)。如果你想选择第一个匹配,当可能有很多时,使用First()方法,如果有多个匹配则不会抛出。

这实际上取决于您的控制器正在使用的是 - 订单或订单详细信息。这将是Orders/Details/1OrderDetails/Details/1之间的差异,其中第一个将关注整个订单及其所有细节,第二个将关注一个特定的行。

如果你想使用订单 - 它看起来像你想要的那样 - 那么你需要从订单到其OrderDetails集合的某种类型的引用。如果您正在使用像MusicStore教程中的Entity Framework之类的东西,那么您将获得此集合作为实体模型的一部分。您可以将Order传递给视图,然后可以在每个或类似的循环中访问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.页面的输入会给您带来一些问题,请确保您清楚地了解您的模型是什么。如果您传入列表 - 就像在Index操作中那样 - 您需要一个继承ViewPage的页面&gt; (您可以在页面顶部的&lt;%@ Page%&gt;声明中看到这一点)。如果您要编写“for each ... in model”之类的代码,那就意味着您的模型必须包含多个内容。这是您的“GetEnumerator”错误消息来自的地方。

您发布的视图继承了ViewPage,即模型是单个对象,而不是对象的集合,因此“对于每个......在模型中”没有明显的含义。 View的类型应与控制器传递的类型相同。 Index方法传递List,List是IEnumerable的一个例子。但是,您的详细信息会传递一个YourModelClass。

2.错误消息“编译器错误消息:CS1061:'ss.Models.OrderDetail'不包含'OrderDetails'的定义” - 检查您的模型,如果表之间存在关系(外键等),它们应该加在模型图上,你通常也有导航属性。你收到这条消息的事实意味着那里的东西不存在。

3.我建议可能值得查看一些视频,因为解释非常方便。尝试http://www.asp.net/mvc/fundamentals处的部分视频。我对Joe Stagner的“为我们其他人”系列讲得非常好,作为起点,Stephen Walther的“创建电影数据库应用程序”会有所帮助,因为它显示了这种情况。