Asp.net core实战8: 模型绑定

Asp.net core自动实现模型绑定,从Form、Route Values、QueryString(三者有顺序)三个方面获取数据

 

简单类型单个参数的绑定

 

Asp.net core实战8: 模型绑定

对于简单类型的数据可以直接获取到

对于路由模板:{controller}/{action}/{value}

若访问地址为:/Calculate/Square/5

那么,对应的数据是Calculate控制器,方法名称是Square,value等于5

 

如果找不到输入的数据怎么办?

1. 如果是简单类型,将得到默认值,比如,int 类型,得到默认的0。 如果是bool则得到false。

2. 如果是String,默认是null

3. 如果是引用类型,默认调用无参构造函数创建对象。

4. 对于可空类型,默认是null

 

简单类型多个参数

 

Asp.net core实战8: 模型绑定

路由模板:{currencyIn}/{currencyOut}

绑定到的数据:

Asp.net core实战8: 模型绑定

Form数据优先绑定。找不到对应的数据则赋值默认值。

 

复杂类型的绑定

 

Asp.net core实战8: 模型绑定

如果出现多个参数,挨个绑定的话,麻烦死了!所以创建一个POCO类,专门存储这些参数,组合成一个对象

Asp.net core实战8: 模型绑定

Asp.net core实战8: 模型绑定

 

集合、字典、都可以作为参数:

Asp.net core实战8: 模型绑定

绑定参数可以来自于Form数据:

currencies[0]=GBR&currencies[1]=USD

也可以:

currencies=GBR&currencies=USD

 

文件上传

 

使用IFormFile绑定文件:

Asp.net core实战8: 模型绑定

多文件上传也可以使用IEnumerable<IFormFile>接收:

Asp.net core实战8: 模型绑定

IFormFile提供了一些方法,可以操作数据:

Asp.net core实战8: 模型绑定

FileName可以获取用户上传的文件的名称,但是一般在开发的时候不使用用户指定的文件名。

使用IFormFile接收小文件是可以的,但是使用IFormFile接收到以后,数据会缓存到内存或者磁盘,等待使用读入流读取。

如果上传的是大文件,建议通过流的方式上传,避免一次性读取全部数据,导致内存爆炸。详情:http://mng.bz/SH7X

 

 

数据绑定源的选择

 

默认的绑定顺序是:FormData、RouteData、QueryString

Asp.net core实战8: 模型绑定

可以使用诸如FromHeader、FromQuery、FromRoute、FromForm或者FromBody类似的特性,指定绑定源

Asp.net core实战8: 模型绑定

可以通过[BindNever] [BindRequired]指定是否是必须参数,[FromServices]是从容器注入的参数,[ModelBinder]提供了更多的可选项。

 

数据验证

 

使用特性标签可以实现数据的验证,例如是否在合适的范围内,是否是可空的,是否长度符合要求。

Asp.net core实战8: 模型绑定

displayName是前端渲染时显示的内容。

除此之外,还有很多验证标签:http://mng.bz/7N7s

当然,你也可以继承ValidationAttribute实现自己的验证特性。

 

验证数据是否都符合要求呢?Asp.net core实战8: 模型绑定

使用ModelState可以检验一下,还可以获取出错信息,这样,我们就得到了验证结果