模型绑定集合属性与局部视图
问题描述:
假设我有一个像这样的模式:模型绑定集合属性与局部视图
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]
)的。我能做些什么来获得我渴望的结果吗?
注意:这是我的实际情况的一个主要过分简化。我认识到,通过这样简单的事情,最好的办法可能是在Bar
上制作EditorTemplate
,并在我看来使用EditorFor
循环播放。如果可能的话,我想避免这个解决方案。
答
当你不想使用EditorTemplate
为Bar
,您的方案的解决方案是:
改变“_EditBars”局部视图Foo
和视图的@model类型应该是这样的:
@model Foo
@if (Model.Bars != null)
{
for (int i = 0; i < Model.Bars.Count; i++)
{
@Html.EditorFor(m => Model.Bars[i].Baz)
}
}
(这将是更好的局部视图的名称更改为'_EditFooBars'
)
希望这有助于。
@gdp,编辑后显示部分视图,并在我的问题底部添加注释。谢谢! – Eric 2013-03-09 06:43:23
你有没有解决它到底?有相同的问题 – user3281466 2015-04-20 11:01:51
已经有一段时间了,所以我不记得细节,但看着我的提交日志,我提出了一些问题后提出了一些引用此问题:http://stackoverflow.com/questions/1488890/asp -net-mvc-partial-views-input-name-prefixes/6292180#6292180,我认为这可能是相关的。 – Eric 2015-04-21 15:14:32