一、从模型到name
模型绑定器会从ValueProvidor那里获得name-value对集合,值来源于表单,URL参数,Query string。模型绑定器通过名字获取相关字段的值。模型字段如何对应到名字呢?
假设有这几个类:
public class Person{
public string Name { get; set; }
public int Age { get; set; }
}
public class Store
{
public List<string> Values { get; set; }
public string Name { get; set; }
public string BriefName { get; set; }
public Person Person { get; set; }
}
1. 简单类模型:
name格式:modelName.FieldName 或者 FiledName。即modelName可选,优先按照全名字的格式查找。
如:ActionFunc(Person person)
在初始化参数person依据name的格式:person.Name,person.Age ,Name,Age
2. 数组/List
2.1 数据元素为基本类型:ActionFunc(List<string> strList)
name格式:[index], 如[0], [1]。index必须以0开始且连续。
2.2 数组元素为Class:ActionFunc(List<Person> strList)
name格式:[index].FieldName, 如[0].Name,[0].Age 。index必须以0开始且连续。
3. 组合类模型:ActionFunc(Store store)
3.1 子元素为非数组:
name格式:{模型名字.}[FiledName].[subFiledName]。"{}" 表示可选(见1 )。
如:{store.}Person.Name,{store.}Person.Age
3.2 子元素为数组:
name格式:{模型名字.}[FiledName][index],关于index的要求同2。
如:{store.}Person[0],{store.}Person[1]
二、name-value对来源
3个来源:URL string,Query string,form表单
2.1 URL string
这个跟MVC 路由配置有关,如路由模式串是:{controller}/{action}/{id},URL是:Home/Store/1,则对应的name-value对为:id=1,即name是id。
2.2 Query string
2.2.1 URL
这个在URL中已经指定了name了。如:?Name=Johnson&Age=12,对应2个name-value对,name分别是Name, Age。
2.2.2 JQuery.ajax
开发中免不了会通过ajax向MVC发送请求。JQuery的ajax方法的data属性可以指定参数。参数是通过Query string的方式传输的。并且参数一般是要先序列化的,ajax方法通过$.param方法序列化参数,为了能够正确的把数据转化为MVC能够认识的name-value对,我们有必要先了解下$.param方法。
(1)了解$.param方法:jQuery.param( obj, traditional )
详细API介绍见官网
参数1:表示要序列化的数据。理论上说数据类型可以是任何类型的,但是正确专程Query string格式的只有Array和简单对象(因为最终结果是name-value对啊)
看看不同类型数据转换的结果把:
B:null, undefined 抛异常。
A:整数,浮点数,boolean,返回空字符窜
$.param(true) -> ''
$.param(1) -> ''
$.param(1.1) -> ''
B:字符串
这个有些特殊,返回的Query string的name是字符串的下标,value是下标对应的字符。
$.param('12hello') -> '0=1&1=2&2=h&3=e&4=l&5=l&6=o'
(ajax方法中不会对string参数进行序列化的)
C:数组:
取数组元素的name字段作为Query string的name名,取数组元素的value字段作为Query string的value,所以数组元素必须含有name和value字段,否则不能正确转换。
$.param([1,2]) -> "undefined=&undefined="
$.param([{name:'Age',value:12,pet:1}]) -> "Age=12" 。(pet字段被过滤掉了哦)
D:简单对象
这个是我们最常使用的格式
$.param({
name:'Johnson',
age:24,
note: 'good'
})
-> "name=Johnson&age=24¬e=good"
E:组合对象:
不同版本的JQuery 对组合对象的序列化还不统一(本文使用JQuery 为1.1),很多情况下序列化后的Query string并不被MVC 认识。考虑到兼容性,最好不要通过JQuery.ajax向 MVC发送组合对象,如果必须要传递的话,可以考虑先将参数转成JSON传到后天后再转成对象。
参数2:表示是否要浅序列化,true:浅序列化,false:深序列化
$.param返回的字符串是URI编码的。
$.param({likes:[12,3]}) -〉"likes%5B%5D=12&likes%5B%5D=3"
$.param({likes:[12,3]},true) -〉"likes=12&likes=3"
(在浅序列化下,可以把一个字段为简单数组的的组合对象成功与MVC实现模型绑定)
2.3 form表单