2017-04-20 45 views
0

考慮以下幾點:如何綁定表單提交中沒有索引的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路由,因爲我不信任它,並且從簡單地嘗試一下自定義綁定器路由,看起來好像開始工作會很痛苦。

+2

答案當然是否定(分度器都必須匹配,屬於與 - 它怎麼會知道你不想'{ID1 = 0,Id2的= 3}'和'{ID1 = 2,Id2的=例如,編寫自定義模型綁定器需要您相信名稱/值對總是以正確的順序發佈。爲什麼不信任javascript? –

+1

您也可以使用隱藏的輸入作爲'.Index'財產相匹配這意味着您不需要擁有基於零的連續索引器的集合 –

+0

@StephenMuecke,是的,當我測試自定義綁定器時,我正在考慮對的順序。至於JS,我只是想讓我的應用程序中的表單不依賴JS來提交,因爲JS可以被禁用。你有隱藏的'.Index'屬性的例子嗎? – Gup3rSuR4c

回答

1

除了使用javascript設置集合索引器或創建自定義模型聯編程序,第三個選項是包含集合.Index屬性的隱藏輸入,該屬性允許您匹配非零非連續索引器。索引的值可以是任何你想要的(如數字,Guidstring),讓你的名稱/值對會是什麼樣子

As[xx].Id1=0 
As[xx].Id2=1 
As.Index=xx 

As[45].Id1=2 
As[45].Id2=3 
As.Index=45 

有關模型綁定到集合的詳細信息,請參閱Model Binding To A List

相關問題