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)" /> 
}