考慮以下幾點:如何綁定表單提交中沒有索引的ASP.NET MVC(5)中的複雜對象集合屬性?
表
<form method="post">
<input name="As[].Id1" />
<input name="As[].Id2" />
<input name="Ids[]" />
</form>
表單數據
As[].Id1=0&As[].Id2=1&As[].Id1=2&As[].Id2=3&Ids[]=4&Ids[]=5
模式
public class A {
public int Id1 { get; set; }
public int Id2 { get; set; }
}
public class B {
public IEnumerable<A> As { get; set; }
public IEnumerable<int> Ids { get; set; }
}
操作方法
[HttpPost]
public ActionResult C(
B b) {...}
在上面的例子中,我希望有B
它是As
屬性包含兩個對象實例:{ Id1=0, Id2=1}
,和{ Id1=2, Id2=3 }
;它的Ids
屬性包含兩個整數:4,5
。在reallity,我得到的B
這樣的情況:它的As
屬性是null
和它的Ids
屬性包含兩個整數:4,5
。
所以,粘合劑似乎有複雜的對象很難映射集合屬性,當表單數據並沒有對集合的索引。如果它有一個索引,從0
開始,它按預期結合。
我的問題是,我的形式不能有索引,因爲過帳領域的量可以在任何給定的點,這就是爲什麼我要使用一個索引少收集其簡單性工作正常變化。
有沒有什麼辦法可以讓活頁夾工作,而不需要走下去1)使用JavaScript提交之前規範化表單,以編輯所有字段名稱並給它們一個索引或2)編寫一個類的自定義活頁夾B
?我想避免JavaScript路由,因爲我不信任它,並且從簡單地嘗試一下自定義綁定器路由,看起來好像開始工作會很痛苦。
答案當然是否定(分度器都必須匹配,屬於與 - 它怎麼會知道你不想'{ID1 = 0,Id2的= 3}'和'{ID1 = 2,Id2的=例如,編寫自定義模型綁定器需要您相信名稱/值對總是以正確的順序發佈。爲什麼不信任javascript? –
您也可以使用隱藏的輸入作爲'.Index'財產相匹配這意味着您不需要擁有基於零的連續索引器的集合 –
@StephenMuecke,是的,當我測試自定義綁定器時,我正在考慮對的順序。至於JS,我只是想讓我的應用程序中的表單不依賴JS來提交,因爲JS可以被禁用。你有隱藏的'.Index'屬性的例子嗎? – Gup3rSuR4c