绑定包含来自Edit Action @model视图的集合



有人可以提供代码,允许[]被使用,以便保存包含在一个@模型中的集合?

编辑视图:

@model MVC3.Models.A
// I need to save collection values but can't use [] here to setup model binding.
@Html.EditorFor(model => model.Bs[0].Val)  

模型:

public  class A
{
    public A()
    {
        this.Bs = new HashSet<B>();
    }
    public int Name { get; set; }
    public virtual ICollection<B> Bs { get; set; }
}
public  class B
{
    public int Val { get; set; }
    public virtual A A { get; set; }
}

问题是您的属性是ICollection<T>,它不提供索引访问元素。

将其更改为IList<T>或仅List<T>,您可以像在第一个示例中一样编写视图代码。

如果由于某种原因您不能更改属性类型,那么您需要为您的特定视图创建一个专门的视图模型,然后将其映射到控制器POST操作中的A模型。

或者,只要遵循适当的HTML约定,可以直接绑定到简单的集合类型(尽管有点尴尬),这意味着使用多个具有相同名称的input元素,正如Phil Haack所描述的,即:
<input type="text" name="ints" value="1" />
<input type="text" name="ints" value="4" />
<input type="text" name="ints" value="2" />
<input type="text" name="ints" value="8" />

但这只适用于简单的类型,即原语或字符串,而不是像B这样的复杂类型。

最后一个注释:如果你使用的是编辑器模板,你通常可以绑定到整个集合,MVC框架会找出如何把它重新组合在一起,就像:

@Html.EditorFor(m => m.Bs);

当然,这使您无法控制

编辑器模板之间的内容,因此,如果您试图为它们生成<li>元素或类似的东西,那么您必须将其直接嵌入编辑器模板中,这可能意味着创建一个专门用于此集合绑定的自定义编辑器模板,并使用相应的覆盖EditorFor(采用模板名称的那个)。

这有点痛苦,但如果到目前为止您一直在UI和数据层之间共享类,则可能比尝试切换到并行模型系统要少得多。

最新更新