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方法。
答案 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)" />
}