2

タイプicollectionのプロパティを持つモデルがあります。

public class myClass{
   public string param1{get; set;}
   public string param2{get; set;}
   public virtual ICollection<myClass2> param3{get; set;}

   public myClass()
   {
       param3 = new hashSet<myClass2>();
   }

}

public class myClass2{
   public string param4{get; set;}
   public string param5{get; set;}
   public virtual myClass param6{get; set;}
}

これらの2つのクラスを含むモデルをビューに渡し、次を使用してicollection内のアイテムを表示できます。foreach(var item in Model.myClass.param3)

そして、アイテムを隠しフィールドに保存して、コントローラーで取得します

foreach(var item in Model.myClass.param3){
      @Html.HiddenFor(model => item.parm4);
      @Html.HiddenFor(model => item.parm5);
 }

しかし、フォームを送信してモデルをコントローラーに渡すと、model.myClass.param3を呼び出すときにカウント=0になります。

ICollectionをビューに渡すにはどうすればよいですか?このリンクを試しましたが、なぜ機能しないのかわかりません。

編集

リンクは、インデックスを作成するためにクラスBookをリストとして使用します(ICollectionをリストにキャストする必要があることを示唆しています)。それ、どうやったら出来るの?また、それをリストにキャストした場合、コントローラーはICollectiionを受け取ることを期待しているので、それをコントローラーに渡すにはどうすればよいですか?

4

1 に答える 1

2

そのためにforeachループを使用することはできません。forループを使用する必要があります。

for (int i=0; i<Model.MyClass.param3.Count; i++)
    {
        @Html.HiddenFor( model => model.MyClass.param3[i])
    }

この理由はHiddenFor、モデルバインディングが機能するために、ヘルパーが各フィールドに一意の名前を割り当てる何らかの方法を必要とするためです。i変数はこれを実現します。

あなたの場合、これを実装するためにリファクタリングを行う必要があります。インデックス作成をサポートしているとは思わないICollectionので、インデックス作成をサポートしているコレクションHashSetにキャストする必要があります。List

このテーマに関するこの優れたブログ投稿を参照してください。

于 2013-01-03T16:46:05.090 に答える