ASP.NET MVC Square Bracket Collection模型绑定

时间:2012-09-21 12:21:52

标签: jquery asp.net-mvc collections model-binding jquery-select2

ASP.NET MVC的集合模型绑定需要<input />名称属性中的方括号索引才能正确绑定集合模型,例如: <input name="Lines[0].Name" />执行以下操作:

public ActionResult Create(IEnumerable<MyInputModel> Lines) {
    // ...
}

但是,对于某些jQuery插件,名称属性中的句点和方括号是known issue,包括我正在使用的Select2列表选择器。

由于我不想破解Select2,我怎么能告诉ASP.NET MVC使用诸如句号或下划线而不是方括号来界定集合索引,例如<input name="Lines.0.Name" />


注意:我正在使用此collection model binding technique生成非连续Guid索引,因此我已经声明了自定义HtmlFieldPrefixScope


更新:我通过在将无效的[]字符传递给bind / {的Select2事件中黑客自定义滚动/调整大小事件名称来解决此问题{1}} jQuery方法。

4 个答案:

答案 0 :(得分:0)

public ActionResult Create(List<MyInputModel> Lines) {
    // ...
}

<input name="Lines[0].Name" />

确保输入名称与列表名称相同索引从0开始

对不起,我想念。试试这种方式。

@foreach (var item in Model)
{
   var name = string.Format("Lines[{0}].name", i);
   <input type="text" name="@name" value="@item.name" />
}

答案 1 :(得分:0)

你真的需要实体清单吗?因为如果没有,并且字符串列表就足够了,你可以跳过带索引的括号:like here

答案 2 :(得分:0)

您无法自定义DefaultModelBinder来实现此目的。但您可以使用自定义FormValueProvider,将来自List.0.Name的传入前缀格式转换为List[0].Name并返回该值。

答案 3 :(得分:0)

我不确定您是否可以更改选择器以使用'id'属性而不是'name'属性。如果是这样,MVC中的集合绑定仍然有效,并且您可以在id属性中使用jquery安全值,可以与Select2一起使用:

@for(int i=0; i<Lines.Count; i++) {
    <input name="@Html.FieldNameFor(m=>m.Name)" id="@Html.FieldIdFor(m => m.Name)" />
}