ITPub博客

首页 > Linux操作系统 > Linux操作系统 > MVC 绑定 集合类型 model

MVC 绑定 集合类型 model

原创 Linux操作系统 作者:ForTechnology 时间:2013-08-08 18:50:17 0 删除 编辑

第一种方式

比如这样一个方法

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/,如需转载,请注明出处,否则将追究法律责任。

下一篇: ModelBinder
请登录后发表评论 登录
全部评论

注册时间:2011-07-21

  • 博文量
    220
  • 访问量
    659722