有人可以提供代码以允许使用[]以便在@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; }
}
答案 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和数据层之间共享课程,那么可能比尝试切换到并行模型系统要少一些工作。现在