使用局部视图对集合属性进行模型绑定

时间:2013-03-09 06:29:43

标签: c# .net asp.net-mvc asp.net-mvc-4 model-binding

假设我有这样的模型:

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

所以,我尝试了this approach

@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制作Bar并在我的视图中循环使用EditorFor。如果可能的话,我想避免这个解决方案。

1 个答案:

答案 0 :(得分:4)

由于您不想对EditorTemplate使用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'

希望这有帮助。