2011-02-04 14 views
1

こんにちは、私はASPには初めてですし、何か助けを求めています。私はMvcMusicStoreチュートリアルヘルプでストアを構築しました。ここでは、OrderID(インデックスビュー)を表示するオーダーを管理するビューを追加してから、詳細ビューに詳細を追加します。情報は、次のようになりますテーブルから来る:MVC、表示データの表示

各製品は、テーブル内の同じ受注コードで新しいレコードを作成しますので、私は受注、その乗算を一覧表示します。各IDを一度だけ表示する方法はありますか?

次にDetaildビューに詳細を表示しようとしましたが、もう一度失敗しました。コントローラでこのコードを使用しました。

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

ただし、明らかに1つの要素しか表示できないため、機能しません。また、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ています:シーケンスの1つの以上の要素があるかどう

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

+0

このチュートリアルへのリンクはありますか? – Spooks

+0

@Spooks - これは、http://www.asp.net/mvc/tutorials/mvc-music-store-part-1のASP.Net MusicStoreになります。 – RichardW1001

答えて

0

Single()は、例外がスローされますので、各ので、ここでエラーがありますOrderには多くのOrderDetailsがあります(これはIEnumerable-ishエラーです)。最初のマッチを選択する場合は、First()メソッドを使用します。複数のメソッドがある場合はスローしません。

実際にコントローラが動作しているのは、OrdersまたはOrderDetailsです。これはOrders/Details/1OrderDetails/Details/1の違いになります。最初は全体注文とその詳細すべてに焦点を当て、2番目は1つの特定の行を探します。

あなたは順序で作業したい場合は - あなたが行っているように見える - そして、あなたは注文からたOrderDetailsのコレクションにいくつかの種類の参照が必要と思います。 MusicStoreチュートリアルのようなEntity Frameworkのようなものを使用している場合は、このコレクションをエンティティモデルの一部として取得します。 Orderをビューに渡すと、各ループまたは類似のループに対してOrderDetailsコレクションにアクセスできます。

public ActionResult details(int id) 
{ 
    Order viewModel = storeDb.Orders.Single(o => o.Id = id); 
    return View(viewModel); 
} 

一致が1つしかない(多数ではない)ので、Idが一意の注文である場合、これは投げられません。「そうでなければ、ViewDataをして作業する必要があるだろう、私はあなたがタイプ注文の強く型付けされたビューを使用されるだろうと仮定してい

<ul> 
<% foreach (OrderDetails od in Model.OrderDetails) { %> 
    <li><%: od.UnitPrice %> (Or whatever information you wanted to show) </li> 
<% } %> 
</ul> 

が、それはあなたのようなあなたの質問からなります。あなたのビューは、その後のようなものを持っている可能性があり既にそれらの概念で十分満足しています。

編集 - あなたにいくつかの問題を引き起こしているページのより...

1.タイピングを追加し、あなたのモデルがまさに自分自身の心の中で明確であることを確認してください。インデックスアクションの場合と同様に、リストを渡す場合は、ViewPageを継承するページが必要です(ページの上部にある<%@ Page%>宣言でこれを見ることができます)。 "for each ... in model"のようなコードを書くつもりなら、あなたのモデルには複数のものが含まれている必要があります。これは、あなたの "GetEnumerator"エラーメッセージの出所です。

あなたのビューはViewPageを継承しています。つまり、モデルはオブジェクトのコレクションではなく単一のオブジェクトであるため、「for each ... in model」は賢明な意味を持ちません。あなたのビューのタイプは、あなたのコントローラーによって引き継がれるタイプと同じでなければなりません。 IndexメソッドはListを渡し、ListはIEnumerableの例です。しかし、あなたの詳細はYourModelClassを1つ渡します。

2.エラーメッセージ "コンパイラエラーメッセージ:CS1061: 'ss.Models.OrderDetail'に 'OrderDetails'の定義が含まれていません - テーブル間に外部キーなどの関係がある場合はモデルをチェックしてくださいモデルダイアグラムで結合する必要があります。また、通常はナビゲーションプロパティも持っています。あなたがこのメッセージを受け取っているという事実は、そこに何かがないことを意味します。

3.説明が非常に便利なので、ビデオのいくつかをチェックする価値があるかもしれないことを示唆しました。いくつかのビデオをhttp://www.asp.net/mvc/fundamentalsで試してみてください。 I Joe Stagnerの「残りの人にとって」シリーズは非常に優れており、この種のことを示すように、Stephen Waltherの「映画DBアプリケーションの作成」の出発点として役立ちます。

+0

ご返信ありがとうございます。私は、Details ViewのOrder、OrderDetails、Productの3つのテーブルからデータを取得する必要があります。私は、Index.aspxにDetailId、Details.aspxに3つのテーブルのデータを表示する必要があります。私はあなたが提示したループを使用しようとしましたが、VSはModel.OrderDetailsの部分のOrderDetailsに下線を引いてエラーが発生しました:コンパイラエラーメッセージ:CS1061: 'ss.Models.OrderDetail'に 'OrderDetails'と拡張メソッド 'OrderDetails' 'ss.Models.OrderDetail'型の最初の引数を受け入れることができます(使用指示文またはアセンブリ参照がありませんか?) – darx

+0

この場合、モデルに関する詳細情報を提供する必要があります。チュートリアルのように、Entity Frameworkを使用していると仮定していました。これは通常、使用できるコレクションプロパティがあることを意味します。あなたの例には他にもたくさんのものがありますので、私はこの答えの編集として投稿します。 – RichardW1001

+0

はい私はEntity Frameworkを使用していましたが、プロジェクトでは多くのことを変更しませんでした。私は3テーブルの名前とそのカラムを自分のニーズに合わせて変更しただけだと言います。だから基本的にアルバムはなく、商品、ジャンル、アーティストの代わりにアーティストとブランド、カテゴリはありません。たぶん私はチュートリアルに基づいてやろうとしていることを書きます。アルバム、アーティスト、数量、価格、住所、都市を表示するOrderIdとDetailsを表示するIndex Viewになります。私は公式フォーラムでいくつかの助けを得ようとしていたが、それは死んでいるようだ。御時間ありがとうございます! – darx