2011-02-04 139 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的「創建電影數據庫應用程序」將有所幫助,因爲它顯示了這種情況。