Asp.Net Core 高级-模型绑定
模型绑定
定义
1.从各种源(路由、表单、查询字符串)中检索数据
2.将数据提供给方法参数和公共属性中的控制器
3.将字符串类型转换为.Net数据
4.更新复杂类型的属性
一般步骤
1.查找方法的第一个参数,得到它的类型和名称
2.查找HTTP的可用源,查找符合名称的数据
3.将该数据转换为该参数的类型
4.依次类推
注意:名称不区分大小写
5.调用这个方法,并将所有转换好的参数传入
6.成功绑定每个模型后,会进行模型验证
目标
模型绑定的目标:action方法的参数,Razor Page的参数,某些指定特性的属性
源
1.默认以键值对的形式从以下源中获取数据
表单
请求正文
路由数据
查询字符串
上传文件
2.路由和查询字符串只能用于简单类型
3.上传的文件仅绑定到实现 IFormFile 或 IEnumerable<IFormFile> 的目标类型
4.1中的情况是一种约定,可以指定具体从哪一个源获取数据
FromQuery
FromHeader
FromForm
FromBody
FromRoute
5.可以为参数类型起个别名
[FromQuery(Name ="text1")]string text
起别名只能用于简单类型,不能用于复杂类型。Query,Header,Form,Route都可以起别名,Body不行。
不存在模型属性的源
如果找不到(而不是找到类,但是类型不匹配)模型属性的源,则不会发生错误,而是将属性设置为null,或者默认值。
可以设置为NULL的设置为null
不可以设置为null的设置为default(T)
复杂类型调用默认构造函数创建实例,不设置属性
类型转换错误
1.如果找到源,但是类型不匹配,和上述结果相同
2.在包含[ApiController]的情况下,如果传入的格式与期望的格式不符,会启动自动HTTP 400错误
3.如果不启用[ApiController],想要校验模型,则需要使用ModelState
简单类型
模型绑定器可以将字符串类型转换简单类型
复杂类型
1.复杂类型默认可以用query进行模型绑定
2.复杂类型在不启用[ApiController]的情况下,默认可以用表单进行模型绑定
3.复杂类型在启用[ApiController]的情况下,默认可以从正文进行模型绑定
4.不管启用不启用不启用都可以指定[FromBody]和[FromForm]
5.可以指定前缀,表示该数据具体属于哪一个复杂类型
public IActionResult Text(string name , [FromForm]Student student1,[FromForm]Student student2)
public IActionResult Text(string name , Student student1, Student student2)
一旦某个复杂类型中的一个属性,指定了前缀,则所有属性都必须指定前缀。要么都指定前缀,要么都不指定前缀。不指定前缀则会被共享。在没有[ApiController],也[FromForm]的情况下(默认使用[FromForm]),相同的名称(不指定前缀)会共享个所有数据。在没有[ApiController],有[FromForm]的情况下,相同的名称(不指定前缀)只会共享给指定了[FromForm]的数据
注意:[FromBody]不能指定多个,[FromBody]无法使用前缀,也无法从query读取数据
6.自定义前缀也只能用于[FromForm]
[Bind(Prefix = "aaa"),FromForm]Student student1
7.[BindRequired] 属性可以将类或属性添加到绑定
8.[BindNever] 属性可以使类或属性忽略到绑定
9.[Bind]可以直接指定哪几类绑定
[Bind("Sui,Age")]
//或者
[Bind("Sui,Age"),FromForm]Student student1
注意:[BInd]方式的运用主要用于过多发布(发布或接受不该有的属性),但是此方法不好。更好的方法是建立一个ViewModel,在这个ViewModel中建立需要的属性。再通过AutoMap将ViewModel复制到Model。
集合
1.在[ApiController]的情况下,默认集合由body接受,body中的数据必须是"[]"。当然也可以显示指定query和form来接受
2.在没有[ApiController]的情况下,默认集合由query接受(query为空时,从form接收),也可以特别指定从body或者form接受
3.body传参
[1,2,3]
4.query传参
list=1&list=2
list[0]=1&list[1]=2 //必须从0开始,数字连续
[0]=1&[1]=2
5.form传参
//和query一样
//再加一种
list[]=1&list[]=2
字典
1.在[ApiController]的情况下,默认集合由body接受。当然也可以显示指定query和form来接受
2.在没有[ApiController]的情况下,默认集合由query接受(query为空时,从form接收),也可以特别指定从body或者form接受
3.body传参
{
"name": "aaa",
"age": "bbb"
}
4.query传参
aaa&dic[11]=aaa&dic[22]=bbb
[0].Key=1050&[0].Value=Chemistry&[1].Key=2000&[1].Value=Economics
//官网举了其他的例子,但是不好用
5.form传参
//和query一样
[11]=aaa&[22]=bbb
特殊数据类型
IFormFile 和 IFormFileCollection
实测无法接受,请使用FormCollection(IFormCollection)
CancellationToken
用于取消异步控制器中的活动。
FormCollection(IFormCollection)
1.接受表单数据,键值对(键值对的值可以为字符串或者文件)
2.使用
public IActionResult Text([FromForm]IFormCollection file)
{
foreach (var item in file.Files)
{
using (FileStream fs = System.IO.File.Create(item.FileName))
{
item.CopyTo(fs);
}
}
return Ok();
}
3.Postman调用
手动模型绑定
运用于mvc
————————————————
版权声明:本文为CSDN博主「飞鸟慕鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34759481/article/details/102718991
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2020-11-11 js数组、json、js对象的区别与联系