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

posted @   dreamw  阅读(269)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2020-11-11 js数组、json、js对象的区别与联系
点击右上角即可分享
微信分享提示