您的位置:首页 > 编程语言 > ASP

ASP.Net MVC 模型绑定

2014-09-12 20:12 525 查看

一、从模型到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表单

表单元素的name属性值为name,value就是表单元素的值了。

name属性可以含有点“.”,id属性是不可以的哦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息