MVC 繫結 集合型別 model

ForTechnology發表於2013-08-08

第一種方式

比如這樣一個方法

public ActionResult Infancy(Person[] people)
{
    // ...  
} 

並在表單中新增這些input元素

<input type="text" name="people[0].FirstName" value="神" />
<input type="text" name="people[0].LastName" value="魚" />
<input type="text" name="people[1].FirstName" value="鬱悶的" />
<input type="text" name="people[1].LastName" value="PP" />
<input type="text" name="people[3].FirstName" value="重" />
<input type="text" name="people[3].LastName" value="典" />

當其作為一個HTTP POST被提交後的資料大概是這個樣子

people%5B0%5D.FirstName=神&people%5B0%5D.LastName=魚&people%5B1%5D.FirstName=鬱悶的&people%5B1%5D.LastName=PP&people%5B3%5D.FirstName=重&people%5B3%5D.LastName=典

那麼通過model binder我們將得到這樣的一個Array集合

people[0].FirstName = "神"  
people[0].LastName = "魚"  
people[1].FirstName = "鬱悶的"  
people[1].LastName = "PP"  
people[3].FirstName = "重"  
people[3].LastName = "典" 

這樣就和我們在程式碼中顯式的構建如下集合是一樣的

people = new Person[] {  
new Person() { FirstName = "神", LastName = "魚" },  
new Person() { FirstName = "鬱悶的", LastName = "PP" } 

這裡會按照parameterName[index].PropertyName的規則來解析屬性。其中,索引必須是連續的且以0開始的正整數。在上面的例子中由於沒有people[2],所以”重典”將不會被解析。

第二種方式

我們再來看下一種情況

方法簽名如下

public ActionResult Infancy(IDictionary<string, Information> people)
{
    // ...  
} 

Html這樣構造

<input type="text" name="people[0].Key" value="forever" />
<input type="text" name="people[0].Value.Age" value="12" />
<input type="text" name="people[0].Value.Gender" value="純爺們" />
<input type="text" name="people[1].Key" value="鬱悶的PP" />
<input type="text" name="people[1].Value.Age" value="50" />
<input type="text" name="people[1].Value.Gender" value="不好說" />

我們將會得到這樣的鍵值集合

people[0].Key = "forever"  
people[0].Value.Age = 12  
people[0].Value.Gender = "純爺們"  
people[1].Key = "鬱悶的PP"  
people[1].Value.Age = 50
people[1].Value.Gender = "不好說" 

如同我們在程式碼中這樣構造

var people = new Dictionary<string, Information>() {  
  { "forever", new Information() { Age = 12, Gender = "純爺們" } },  
  { "鬱悶的PP", new Information() { Age = 50, Gender = "不好說" } }  
};

這裡解析key的方式是尋找parameterName[index].Key這樣的結構、解析value的方式是尋找parameterName[index].Value這樣的結構。如果key或者value是複雜型別(如上面例子中的Information型別),則parameterName[index].KeyparameterName[index].value將被視為字首(也可以理解為某個型別)而.PropertyName被視為字尾(即某個屬性)。這裡的索引也要求必須是以0開始的不間斷的正整數。否則斷開以後的部分將不會被解析。

構建IEnumerable, ICollection, IList, T[], Collection, 以及List這類集合型別需要使用第一種語法。
而構建IDictionary 和 Dictionary這類集合需要使用第二種語法。

如果你不喜歡這種方式,你完全可以在Asp.net mvc中自定義一些binder來處理特定的型別。或者直接使用FormCollection

<form method="post" action="/Home/Create">

    <input type="hidden" name="products.Index" value="cold" />
    <input type="text" name="products[cold].Name" value="Beer" />
    <input type="text" name="products[cold].Price" value="7.32" />
    
    <input type="hidden" name="products.Index" value="123" />
    <input type="text" name="products[123].Name" value="Chips" />
    <input type="text" name="products[123].Price" value="2.23" />
    
    <input type="hidden" name="products.Index" value="caliente" />
    <input type="text" name="products[caliente].Name" value="Salsa" />
    <input type="text" name="products[caliente].Price" value="1.23" />
    
    <input type="submit" />
form>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-768081/,如需轉載,請註明出處,否則將追究法律責任。

相關文章