3

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

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

但是,名称属性中的句点和方括号是某些 jQuery 插件的一个已知问题,包括我正在使用的Select2列表选择器。

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


注意:我正在使用这个集合模型绑定技术来生成非顺序Guid索引,所以我已经声明了一个自定义的HtmlFieldPrefixScope.


更新:我通过破解 Select2 事件中的自定义滚动/调整大小事件名称来解决这个问题,这些事件将无效[]字符传递给bind/ unbindjQuery 方法。

4

4 回答 4

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" />
}
于 2012-09-21T13:15:19.577 回答
0

您真的需要实体列表吗?因为如果不是,并且字符串列表就足够了,您可以跳过带索引的括号:就像这里

于 2012-09-21T13:37:08.153 回答
0

您不能自定义 DefaultModelBinder 来实现这一点。但是您可以使用自定义FormValueProvider将传入的前缀格式转换List.0.NameList[0].Name并返回值。

于 2012-09-21T13:53:53.320 回答
0

我不确定您是否可以更改选择器以使用“id”属性而不是“名称”属性。如果是这样,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)" />
}
于 2012-09-21T15:55:26.197 回答