Eri*_*ric 5 .net c# asp.net-mvc model-binding asp.net-mvc-4
假设我有这样的模型:
public class Foo {
public List<Bar> Bars { get; set; }
public string Comment { get; set; }
}
public class Bar {
public int Baz { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要一个Foo让用户编辑Bar项目的视图.但有一个问题:我希望Bar通过局部视图处理编辑.
@model Web.ViewModels.Foo
@using(Html.BeginForm()) {
@Html.Partial("_EditBars", Model.Bars)
@Html.TextAreaFor(m => m.Comment)
...
}
Run Code Online (Sandbox Code Playgroud)
该_EditBars局部视图看起来是这样的:
@model List<Web.ViewModels.Bar>
@for (int i = 0; i < Model.Count; i++) {
@Html.EditorFor(m => Model[i].Baz)
}
Run Code Online (Sandbox Code Playgroud)
我希望这个模型绑定到我的动作,看起来像:
[HttpPost]
public ActionResult Edit(Foo foo) {
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是我发布的数据,它没有模型绑定Bars属性:
[1].Baz=10&[0].Baz=5&Comment=bla
Run Code Online (Sandbox Code Playgroud)
这是不合理的,因为它缺少Bars前缀.如果我理解正确,我需要它是这样的:
Bars[1].Baz=10&Bars[0].Baz=5&Comment=bla
Run Code Online (Sandbox Code Playgroud)
所以,我尝试了这种方法:
@Html.Partial(
"_EditBars",
Model.Bars,
new ViewDataDictionary(ViewData)
{
TemplateInfo = new TemplateInfo
{
HtmlFieldPrefix = "Bars"
}
})
Run Code Online (Sandbox Code Playgroud)
但那也没有用.有了这个,我得到:
Bars.[1].Baz=10&Bars.[0].Baz=5&Comment=bla
Run Code Online (Sandbox Code Playgroud)
我认为这是因为额外的时期(Bars.[1]相对Bars[1])而无效.我有什么办法可以得到我想要的结果吗?
注意:这是我实际情况的一个主要过分简化.我认识到,通过这种简单的方法,最好的方法可能是在我的视图中进行EditorTemplatefor Bar和循环使用EditorFor.如果可能的话,我想避免这个解决方案.
由于您不想使用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)
}
}
Run Code Online (Sandbox Code Playgroud)
(最好将部分视图的名称更改为'_EditFooBars')
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
2737 次 |
| 最近记录: |