ASP.Net MVC 模型绑定

一、从模型到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&note=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属性是不可以的哦。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值