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

时间:2011-10-24 01:24:25

标签: asp.net-mvc asp.net-mvc-3

有人可以提供代码以允许使用[]以便在@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; }
}

1 个答案:

答案 0 :(得分:0)

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

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

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

或者,只要遵循正确的HTML约定, 就可能(尽管有点尴尬)直接绑定到简单集合类型,这意味着使用多个{ {1}}具有相同名称的元素as described by Phil Haack,即:

input

但这仅适用于简单类型,即基元或字符串,而不是像此类上下文<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" /> 之类的复杂类型。

最后一条评论:如果你正在使用编辑器模板,你通常只能绑定到整个集合,而MVC框架将会找出如何将它重新组合在一起,如:

B

当然,这使您无法控制每个项目的编辑器模板之间的内容,因此,如果您尝试为其生成@Html.EditorFor(m => m.Bs); 元素或类似的内容然后,您必须将其直接嵌入到编辑器模板中,这可能意味着专门为此集合绑定创建自定义编辑器模板,并使用相应的<li>覆盖(采用模板名称的模板)。

这有点痛苦,但如果您已经在UI和数据层之间共享课程,那么可能比尝试切换到并行模型系统要少一些工作。现在