次のようなモデルがあるとします。
public class Foo {
public List<Bar> Bars { get; set; }
public string Comment { get; set; }
}
public class Bar {
public int Baz { get; set; }
}
そして、Foo
ユーザーがBar
アイテムを編集できるビューが必要です。しかし、落とし穴Bar
があります。編集を部分ビューで処理する必要があります。
@model Web.ViewModels.Foo
@using(Html.BeginForm()) {
@Html.Partial("_EditBars", Model.Bars)
@Html.TextAreaFor(m => m.Comment)
...
}
部分ビューは次の_EditBars
ようになります。
@model List<Web.ViewModels.Bar>
@for (int i = 0; i < Model.Count; i++) {
@Html.EditorFor(m => Model[i].Baz)
}
これを自分のアクションにモデルバインドする必要があります。これは次のようになります。
[HttpPost]
public ActionResult Edit(Foo foo) {
// Do stuff
}
残念ながら、これは私が投稿しているデータであり、Bars
プロパティをモデルバインドしていません。
[1].Baz=10&[0].Baz=5&Comment=bla
Bars
プレフィックスがないため、これが機能しないことは理にかなっています。私が正しく理解しているなら、私はそれがこれである必要があります:
Bars[1].Baz=10&Bars[0].Baz=5&Comment=bla
だから、私はこのアプローチを試しました:
@Html.Partial(
"_EditBars",
Model.Bars,
new ViewDataDictionary(ViewData)
{
TemplateInfo = new TemplateInfo
{
HtmlFieldPrefix = "Bars"
}
})
しかし、それも機能していません。それで、私は得ています:
Bars.[1].Baz=10&Bars.[0].Baz=5&Comment=bla
私はそれが余分な期間(Bars.[1]
対Bars[1]
)のために機能していないと思います。私が望む結果を得るために私にできることはありますか?
注:これは、私の実際の状況を大幅に単純化しすぎています。私は、これほど単純なものを使用する場合、おそらく最善のアプローチは、私の見解でEditorTemplate
forを作成Bar
して使用することをループすることであることを認識しEditorFor
ています。可能であれば、この解決策は避けたいと思います。