【发布时间】:2021-06-27 11:41:30
【问题描述】:
为什么我们应该在 ASP.NET Core 模型绑定中应用这些属性?
不使用会有什么后果?
在没有这些属性的情况下,模型绑定引擎是否能够搜索传入的请求并将它们映射到控制器操作方法参数:
-
[FromQuery]- 从查询字符串中获取值。 -
[FromRoute]- 从路线数据中获取值。 -
[FromForm]- 从发布的表单字段中获取值。 -
[FromBody]- 从请求正文中获取值。 -
[FromHeader]- 从 HTTP 标头获取值。
请参阅此控制器操作方法示例:
public ActionResult<Pet> Create([FromBody] Pet pet)
public ActionResult<List<Pet>> Search([FromRoute] string breed, [FromQuery] string color, [FromQuery] int age)
我们也可以将属性应用到模型类:
public class Pet
{
public string Name { get; set; }
[FromQuery]
public string Breed { get; set; }
}
不带属性的控制器动作方法示例:
public ActionResult<Pet> Create(Pet pet)
public ActionResult<List<Pet>> Search(string breed, string color, int age)
【问题讨论】:
-
安全性可能是它的一个原因。使用这些属性时,您明确说明您期望这些值来自哪个来源。这样我们就可以禁止参数篡改。
-
如果您想要非默认绑定源或名称,可以使用它们。
-
模型绑定允许绑定复杂类型,因此您可以绑定
Pet而不是像breed这样的单个值。它还允许绑定嵌套的复杂类型、数组、字典、集合等。 -
您可以查看Sources的描述,默认情况下,模型绑定从HTTP请求中的以下来源以键值对的形式获取数据:表单字段,请求正文(对于控制器具有 [ApiController] 属性)、路由数据、查询字符串参数、上传的文件。对于每个目标参数或属性,源将按照前面列表中指示的顺序进行扫描。如果默认来源不正确,我们可以使用其中一个属性来指定来源。
-
如何在不使用属性的情况下默认从所有可用源进行绑定?
标签: asp.net-core model-binding