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