5

次のようなモデルがあるとします。

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])のために機能していないと思います。私が望む結果を得るために私にできることはありますか?

注:これは、私の実際の状況を大幅に単純化しすぎています。私は、これほど単純なものを使用する場合、おそらく最善のアプローチは、私の見解でEditorTemplateforを作成Barして使用することをループすることであることを認識しEditorForています。可能であれば、この解決策は避けたいと思います。

4

1 に答える 1

4

EditorTemplateforを使用したくないのでBar、シナリオの解決策は次のようになります。

'_EditBars'部分ビューの@modelタイプをに変更するFooと、ビューは次のようになります。

@model Foo

@if (Model.Bars != null)
{
    for (int i = 0; i < Model.Bars.Count; i++)
     {
         @Html.EditorFor(m => Model.Bars[i].Baz)
     }
}

(部分ビューの名前をに変更することをお勧めします'_EditFooBars'

お役に立てれば。

于 2013-03-09T10:04:58.543 に答える