模型绑定集合属性与局部视图

模型绑定集合属性与局部视图

问题描述:

假设我有一个像这样的模式:模型绑定集合属性与局部视图

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循环播放。如果可能的话,我想避免这个解决方案。

+0

@gdp,编辑后显示部分视图,并在我的问题底部添加注释。谢谢! – Eric 2013-03-09 06:43:23

+0

你有没有解决它到底?有相同的问题 – user3281466 2015-04-20 11:01:51

+0

已经有一段时间了,所以我不记得细节,但看着我的提交日志,我提出了一些问题后提出了一些引用此问题:http://stackoverflow.com/questions/1488890/asp -net-mvc-partial-views-input-name-prefixes/6292180#6292180,我认为这可能是相关的。 – Eric 2015-04-21 15:14:32

当你不想使用EditorTemplateBar,您的方案的解决方案是:

改变“_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'

希望这有助于。

+0

这将是一个很好的解决方案,谢谢。 – Eric 2013-03-09 15:16:51

+0

-1它的工作原理,但它不是可重用的,也是糟糕的设计。 – Levitikon 2013-06-14 13:05:02