Asp.net core实战8: 模型绑定
Asp.net core自动实现模型绑定,从Form、Route Values、QueryString(三者有顺序)三个方面获取数据
简单类型单个参数的绑定
对于简单类型的数据可以直接获取到
对于路由模板:{controller}/{action}/{value}
若访问地址为:/Calculate/Square/5
那么,对应的数据是Calculate控制器,方法名称是Square,value等于5
如果找不到输入的数据怎么办?
1. 如果是简单类型,将得到默认值,比如,int 类型,得到默认的0。 如果是bool则得到false。
2. 如果是String,默认是null
3. 如果是引用类型,默认调用无参构造函数创建对象。
4. 对于可空类型,默认是null
简单类型多个参数
路由模板:{currencyIn}/{currencyOut}
绑定到的数据:
Form数据优先绑定。找不到对应的数据则赋值默认值。
复杂类型的绑定
如果出现多个参数,挨个绑定的话,麻烦死了!所以创建一个POCO类,专门存储这些参数,组合成一个对象。
集合、字典、都可以作为参数:
绑定参数可以来自于Form数据:
currencies[0]=GBR¤cies[1]=USD
也可以:
currencies=GBR¤cies=USD
文件上传
使用IFormFile绑定文件:
多文件上传也可以使用IEnumerable<IFormFile>接收:
IFormFile提供了一些方法,可以操作数据:
FileName可以获取用户上传的文件的名称,但是一般在开发的时候不使用用户指定的文件名。
使用IFormFile接收小文件是可以的,但是使用IFormFile接收到以后,数据会缓存到内存或者磁盘,等待使用读入流读取。
如果上传的是大文件,建议通过流的方式上传,避免一次性读取全部数据,导致内存爆炸。详情:http://mng.bz/SH7X
数据绑定源的选择
默认的绑定顺序是:FormData、RouteData、QueryString
可以使用诸如FromHeader、FromQuery、FromRoute、FromForm或者FromBody类似的特性,指定绑定源
可以通过[BindNever] [BindRequired]指定是否是必须参数,[FromServices]是从容器注入的参数,[ModelBinder]提供了更多的可选项。
数据验证
使用特性标签可以实现数据的验证,例如是否在合适的范围内,是否是可空的,是否长度符合要求。
displayName是前端渲染时显示的内容。
除此之外,还有很多验证标签:http://mng.bz/7N7s
当然,你也可以继承ValidationAttribute实现自己的验证特性。
验证数据是否都符合要求呢?
使用ModelState可以检验一下,还可以获取出错信息,这样,我们就得到了验证结果