在asp.net mvc中,我们可以在html表单中使用特定的格式传递参数,从而通过model binder构造一些集合类型。
第一种方式
1
2
3
4
|
public
ActionResult Infancy(Person[] people)
{
// ...
}
|
Html表单构造
1
2
3
4
5
6
|
<input name=
"people[0].FirstName"
type=
"text"
value=
"神"
/>
<input name=
"people[0].LastName"
type=
"text"
value=
"鱼"
/>
<input name=
"people[1].FirstName"
type=
"text"
value=
"郁闷的"
/>
<input name=
"people[1].LastName"
type=
"text"
value=
"PP"
/>
<input name=
"people[3].FirstName"
type=
"text"
value=
"重"
/>
<input name=
"people[3].LastName"
type=
"text"
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我们将得到这样的一个people变量的Array集合
1
2
3
4
5
6
|
people[0].FirstName =
"神"
people[0].LastName =
"鱼"
people[1].FirstName =
"郁闷的"
people[1].LastName =
"PP"
people[3].FirstName =
"重"
people[3].LastName =
"典"
|
这样就和我们在代码中显式的构建如下集合是一样的
1
2
3
|
people =
new
Person[] {
new
Person() { FirstName =
"神"
, LastName =
"鱼"
},
new
Person() { FirstName =
"郁闷的"
, LastName =
"PP"
}
|
这里会按照parameterName[index].PropertyName的规则来解析属性。其中,索引必须是连续的且以0开始的正整数。在上面的例子中由于没有people[2],所以”重典”将不会被解析。
第二种方式
1
2
3
4
|
public
ActionResult Infancy(IDictionary<
string
, Information> people)
{
// ...
}
|
Html表单构造
1
2
3
4
5
6
|
<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=
"不好说"
/>
|
那么通过model binder我们将得到这样的一个people键值集合:
1
2
3
4
5
6
|
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 =
"不好说"
|
如同我们在代码中这样构造:
1
2
3
4
|
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].Key或parameterName[index].value将被视为前缀(也可以理解为某个类型)而.PropertyName被视为后缀(即某个属性)。这里的索引也要求必须是以0开始的不间断的正整数。否则断开以后的部分将不会被解析。
构建IEnumerable<T>, ICollection<T>, IList<T>, T[], Collection<T>, 以及 List<T>这类集合类型需要使用第一种语法。
而构建IDictionary<TKey, TValue> 和 Dictionary<TKey, TValue>这类集合需要使用第二种语法。
如果你不喜欢这种方式,你完全可以在Asp.net mvc中自定义一些binder来处理特定的类型。或者直接使用FormCollection。
更多IT相关的文章,欢迎光临我的个人网站:http://www.zuowenjun.cn/