使用部分视图绑定集合属性的模型

6
假设我有一个这样的模型:
public class Foo {
    public List<Bar> Bars { get; set; }
    public string Comment { get; set; }
}

public class Bar {
    public int Baz { get; set; }
}

我希望有一个视图可以让用户编辑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]). 有什么办法可以得到我想要的结果吗?
注意: 这是对我的真实情况的严重简化。 我知道对于如此简单的事情,最好的方法可能是为我的视图中的Bar制作一个EditorTemplate并使用EditorFor循环。 如果可能的话,我想避免这种解决方案。

@gdp,编辑以显示部分视图,并在我的问题底部添加了一条注释。谢谢! - Eric
你最终解决了吗?我也遇到了同样的问题。 - user3281466
已经有一段时间了,所以我不记得细节了,但是看着我的提交日志,我在问完这个问题后提交了一些东西,参考了这个链接:https://dev59.com/IXI_5IYBdhLWcg3wMf9_#6292180,我相信这可能是相关的。 - Eric
@user3281466,忘记标记你了,而且我不确定编辑我的评论来标记你是否会发送通知给你。 - Eric
谢谢你,我解决了我的问题,但是会查看你提到的主题以获取更多信息。 - user3281466
1个回答

4

如果您不想为Bar使用EditorTemplate,那么解决方案可以是:

将'_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')

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接