2011-12-06 10 views
1

は、私はビューモデルに列挙プロパティを編集する必要がある状況があります:私はthisポストに従っているMVCビューでの編集のIEnumerableモデルプロパティ

public class ViewModel 
{ 
    public MyObj Obj { get; set; } 
    public IEnumerable<MyObj> MyObjs = new List<MyObj>(); 
} 

を。コントローラのアクション:

public ActionResult Index() 
{ 
    var viewModel = new ViewModel(); 
    viewModel.Obj = new Obj() { Name = "0", Value = true }; 
    var o1 = new MyObj() { Name = "1", Value = false }; 
    var o2 = new MyObj() { Name = "2", Value = false }; 
    viewModel.Objs = new List<Obj>() { o1, o2 }; 

    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Index(ViewModel viewModel) 
{ 
    return View(viewModel); 
} 

Indexビューを次のように

<% using (Html.BeginForm()) { %> 

    <table> 
     <tr> 
      <th>Name</th> 
      <th>Value</th> 
     </tr> 
     <%= Html.EditorFor(x => x.Objs) %> 
    </table> 

    <br /> 

    <input type="submit" value="Submit" /> 

<% } %> 

そして "〜/ビュー/ホーム/ EditorTemplates/Obj.ascx" のエディタテンプレートを:

<tr> 
     <td><%: Html.TextBoxFor(x => x.Name) %></td> 
     <td><%: Html.CheckBoxFor(x => x.Value) %></td> 
    </tr> 

問題は:インデックスを参照すると、データが表示されます。 POSTと列挙可能なデータが消えます。ステップス・スルー、ビュー・モデル内の特異な「Obj」が残っているので、消えていく列挙可能なデータだけです。

私はこれをしばらく前から見てきました。誰か助けてくれれば華麗になるでしょう。

乾杯、

Tim。

答えて

0

Phil Haackのthis postを見てください。MVC2は、小さな操作をしない限り、リストをビューモデルにバインドすることをネイティブにサポートしていません。

更新:これをもう少し調べて、コントローラにTryUpdateModel(viewModel.MyObjs, "MyObjs");を追加してみるべきだと思います。これは、ModelBinderに、フォームのデータをViewModelのコレクションにアタッチするために、 "MyObjs"バインディングプレフィックスを使用する必要があることを通知します。

+0

私はこの記事で検出できる唯一の違いは、 "for"ステートメントを使用していたことです。これは残念なことに、異なるHTMLや異なる結果を生成しませんでした。 – Hanshan

+0

ビューで生成されたHTMLをチェックしましたか?すべてのObjエディタは同じ名前/ IDを持っていますか?それらはインデクサー(つまり、)で生成されている必要があります。 –

+0

Stephenにお手伝いしてくれてありがとう。残念ながら、それらは正しいと思われます。名前= "MyObjs [0] .Name"と "MyObjs [1] .Name" - 私に手がかりを与えません! – Hanshan

関連する問題