3

ASP.NET MVC的集合模型绑定需要方括号索引<input />要正确绑定集合模型的名称属性。 <input name="Lines[0].Name" />与像一个动作:ASP.NET MVC方括号集合模型绑定

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

然而,在名称属性时期,方括号是一定的jQuery插件,包括我现在用的是Select2列表选择一个known issue

因为我不想破解Select2,我该如何告诉ASP.NET MVC使用类似句号或下划线而不是方括号来划定集合索引,例如, <input name="Lines.0.Name" />


注:我用这collection model binding technique产生非顺序Guid指标,所以今年已经宣布的自定义HtmlFieldPrefixScope


更新:我解决了这个由黑客攻击的自定义滚动/在无效[]字符传递给bind/unbind jQuery方法选择二事件调整事件名称。

回答

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

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

确保输入名称相同列表名称指数从0开始

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

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

这不解决我的问题。 –

0

你是否真的需要一个实体列表?因为如果没有,并且列表中的字符串就足够了,您可以跳过包含索引的括号:like here

+0

每个项目都有多个属性。您提供的链接也使用方括号来索引项目。 –

+0

是的,如果项目有几个属性(不只是'名称'),你应该使用括号。这就是为什么我问你问题。但如果根据上面的链接只是'名称'属性,你可以写如下: 但据我了解你,这不是你的解决方案...希望,你会找到另一个。 –

0

您不能自定义DefaultModelBinder来实现该功能。但是,您可以使用自定义FormValueProvider,它将将来电前缀格式从List.0.Name转换为List[0].Name并为此返回值。

+0

谢谢,我想我可能不得不编写一个自定义集合模型联编程序。你能指出我如何做到这一点的正确方向?一些示例代码会走很长的路。 –

+0

创建自定义集合模型联编程序是一项复杂的工作,您可以了解到,当您看到DefaultModelBinder的源代码并且某些方法是内部的或私人的,这使得我们的生活变得复杂。 – VJAI

+0

通过在Select2上黑客修复此问题。更新的问题。 –

0

我不确定您是否可以更改您的选择器以使用“id”属性而不是“名称”属性。如果是这样,集合在MVC约束力仍然会工作,并在ID属性,你可以选择二用,你将有jQuery的安全值:

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