假设我有这样一个模型:
public class Foo {
public List<Bar> Bars { get; set; }
public string Comment { get; set; }
}
public class Bar {
public int Baz { get; set; }
}
我想要一个 Foo
View ,让用户可以编辑 Bar
项。但有一个问题:我希望 Bar
编辑由分部 View 处理。
@model Web.ViewModels.Foo
@using(Html.BeginForm()) {
@Html.Partial("_EditBars", Model.Bars)
@Html.TextAreaFor(m => m.Comment)
...
}
_EditBars
局部 View 看起来像这样:
@model List<Web.ViewModels.Bar>
@for (int i = 0; i < Model.Count; i++) {
@Html.EditorFor(m => Model[i].Baz)
}
我希望这个模型绑定(bind)到我的操作,看起来像这样:
[HttpPost]
public ActionResult Edit(Foo foo) {
// Do stuff
}
不幸的是,这是我发布的数据,它没有模型绑定(bind) 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
并在我的 View 中使用 EditorFor
循环。如果可能,我想避免使用此解决方案。
最佳答案
由于您不想为 Bar
使用 EditorTemplate
,您的场景的解决方案可能是:
将“_EditBars”部分 View 的@model 类型更改为Foo
, View 应如下所示:
@model Foo
@if (Model.Bars != null)
{
for (int i = 0; i < Model.Bars.Count; i++)
{
@Html.EditorFor(m => Model.Bars[i].Baz)
}
}
(最好将局部 View 的名称更改为'_EditFooBars'
)
希望这对您有所帮助。
关于c# - 模型将集合属性与局部 View 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15307978/