私が次のものを持っているとしましょう:
public class Foo
{
public string Value1 { get; set; }
public string Value2 { get; set; }
}
public class BarViewModel
{
public string Baz { get; set; }
public IList<Foo> Foos { get; set; }
}
そして、私は:を受け取るビューを持っていますBarViewModel
:
@model BarViewModel
@Html.EditorFor(model => model.Baz)
<table>
@for(int i = 0 ; i < Model.Foos.Count ; i ++)
{
string name1 = "Foos[" + i.ToString() + "].Value1";
string name2 = "Foos[" + i.ToString() + "].Value2";
<tr>
<td>
<input type="text" name="@name1" value="@Model.Foos[i].Value1" />
</td>
<td>
<input type="text" name="@name2" value="@Model.Foos[i].Value2" />
</td>
</tr>
}
</table>
そして私のコントローラーには、を受け取るPOSTメソッドがありBarViewModel
ます。
Value1とValue2に対して生成された入力名が"Foos[0].Value1"
など"Foos[1].Value1"
の場合、POSTメソッドのBarViewModelのコレクションはModelBinderによって自動的に入力されます。素晴らしい。
問題は、私の見解では、このようにすると:
@for(int i = 0 ; i < Model.Foos.Count ; i ++)
{
<tr>
<td>
@Html.EditorFor(model => model.Foos[i].Value1);
</td>
<td>
@Html.EditorFor(model => model.Foos[i].Value2);
</td>
</tr>
}
次に、入力用に生成された名前はのよう"Foos__0__Value1"
になり、モデルのバインディングが壊れます。Foos
POSTメソッドのBarViewModelのプロパティが次のようになりましたnull
私は何かが足りないのですか?
編集
EditorFor
コレクション自体で使用する場合:
@EditorFor(model => model.Foos)
名前は正しく生成されます。しかし、それは私にタイプを処理するために/ Views / ShareにViewModelを構築することを強制しますFoos
、それは私が本当にしたくない行を生成します...
編集2
ここで私の質問を明確にします、それは少し曖昧であることを理解しています。
私が行った場合 :
@EditorFor(model => model.Foos)
入力の名前には形式が"Foos[0].Value1"
あり、モデルのバインドは投稿で問題なく機能します。
しかし、私がそうするなら:
@for(int i = 0 ; i < Model.Foos.Count ; i ++)
{
@EditorFor(model => Model.Foos[0].Value1)
}
名前は形式"Foos__0__Value1"
を取り、モデルバインディングは機能しません。私のpostメソッドでは、model.Foosはnullになります。
2番目の構文がモデルのバインドを壊す理由はありますか?