2012-10-02 5 views
8

の編集:MVC - 私はMVCでの次のクラスのレイアウトを持つオブジェクトのリスト

public class ReportModel 
{ 
    List<SomeItem> items; 
    string value; 
    string anotherValue; 
} 

今、私はこのタイプのMVCで強く型付けされたビューを作成し、それぞれの値を編集だけでなく、ために編集可能なテキストフィールドを作成しますforeachループを使用してテキストフィールドに値を設定し、someitemのリスト内の項目を編集します。

httppostメソッドに送信すると、特異値がreportmodelオブジェクトに正常に戻ってきますが、リストはオブジェクトに返されません。これはどのように行うべきですか?

私はhttppost私はMVCは戻っsomeitem

if (Model.items != null && Model.items.Count > 0) 
{ 
    for (int i = 0; i < Model.items.Count; i++) 
    {     
     <div class="editrow"> 
      <div class="edititem"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.items.ElementAt(i).propertyOne) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.items.ElementAt(i).propertyOne) 
        @Html.ValidationMessageFor(m => m.items.ElementAt(i).propertyOne) 
       </div> 
      </div> 
      <div class="edititem"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.items.ElementAt(i).propertyTwo) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.items.ElementAt(i).propertyTwo) 
        @Html.ValidationMessageFor(m => m.items.ElementAt(i).propertyTwo) 
       </div> 
      </div> 
      <div class="edititem"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.items.ElementAt(i).propertyThree) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.items.ElementAt(i).propertyThree) 
        @Html.ValidationMessageFor(m => m.items.ElementAt(i).propertyThree) 
       </div> 
      </div> 
     </div> 
    } 
} 
+0

まず:つべこべ:タイトル:リストではなく、点灯 2番目:あなたが話しているhttppostメソッドとは何ですか? Androidはここで話していますか?それを示すためにそのタグを追加してください。 – bldoron

+6

は、あなたはこれを読みました:http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx –

+0

@KirillBestemyanovそれは私がいないとは別のパラメータとしてレポートモデルでそれらを取り戻すために期待していて私が探しているかなりのものではないのです確かに機能 – DMCApps

答えて

1

のリストを掲示するための

[HttpPost] 
public ActionResult EditReport(ReportModel report) 
{ 
    // Save the report in here after the update on the UI side 
} 

ビューコードに掲示される方法を参考にしていますと言うときスコットHanselman氏のブログエントリへのキリルの参照があります正解ですが、あなたはそれをあまりにも狭く読んでいます。示された例では、彼はアクションメソッドに配列を渡しますが、親モデル内にも同様に簡単に含めることができます。同じ概念が適用されます。

しかし、知っている一つのことは、デフォルトのモデルバインダーは、ネストされたクラスをインスタンス化していないので、それはそれは常にnullになります意味Listクラスのインスタンスを作成しないということです。これを修正するには、コンストラクタで空のリストクラスをインスタンス化する必要があります。

これは問題の一部に過ぎませんが、データをモデルバインダーでバインドするための正しい形式でフォーマットする必要があります。 Scottさんのブログ記事は、モデルバインダーがデータをリストとして認識するのに必要な形式を提供するため、ここに掲載されています。

これは、EditorTemplateを使用し、Html.EditorFor(m => m.Items)を使用してSomeItem.cshtml EditorTemplateを使用すると、通常処理されます。これはコレクション項目の命名の問題を扱っています(厳密に型指定されたヘルパーもテンプレートに使用している限り)。

11

ラムダ式でElementAt(1)を使用しないでください=>これは入力フィールド名を破壊します。キリルが提案したブログ記事をお読みください。これはあなたのitemsプロパティがList<SomeItem>またはSomeItem[]のいずれかのように宣言されていることを前提とコレクションへのインデクサアクセス権を持っているために、もちろん

for (int i = 0; i < Model.items.Count; i++) 
{     
    <div class="editrow"> 
     <div class="edititem"> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.items[i].propertyOne) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.items[i].propertyOne) 
       @Html.ValidationMessageFor(m => m.items[i].propertyOne) 
      </div> 
     </div> 
     <div class="edititem"> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.items[i].propertyTwo) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.items[i].propertyTwo) 
       @Html.ValidationMessageFor(m => m.items[i].propertyTwo) 
      </div> 
     </div> 
     <div class="edititem"> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.items[i].propertyThree) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.items[i].propertyThree) 
       @Html.ValidationMessageFor(m => m.items[i].propertyThree) 
      </div> 
     </div> 
    </div> 
} 

だから、インデックス付きアクセスを使用することができます。 IEnumerable<SomeItem>の場合は動作しません。そのため、ビューモデルでこのプロパティのタイプを変更するだけです。

+0

hmm私はビューにまっすぐ渡されたエンティティオブジェクトを使用していて、IEnumerableを期待していると思いますので、私は私のことがIEnumerableだと思います。基本的に私はmodelviewオブジェクトを作成する必要があります。これは望ましくないものです。私のオブジェクトに約180のフィールドがあるからです(それは私のプロジェクトではありません)。 – DMCApps

+2

フォームには180個のフィールドがあり、それらはすべてビューに必要ですか?このような場合は、ビューモデルを使用しても実際には大きなメリットはありません。この場合、カスタムエディタテンプレートを使用できます。ビューに 'for'ループを書き込まないでください。ループ全体を '@Html.EditorFor(x => x.items)'で置き換えて、 'SomeItem'クラスのカスタムエディタテンプレート'〜/ Views/Shared/EditorTemplates/SomeItem.cshtml'を定義してください。 ASP.NET MVCはアイテムコレクションの各要素に対してこのカスタムテンプレートを自動的に呼び出すので、テンプレートは '@model SomeItem'に強く型付けされます –

+1

次にカスタムテンプレートの中にdivでマークアップを入れ、次の式を使用します:' ' @ Html.TextBoxFor(x => x.propertyOne)、... '。この場合、ヘルパーは入力フィールドに適切な名前を生成します。 –

関連する問題