【问题标题】:Why use ASP.NET Core modelbinding attributes?为什么使用 ASP.NET Core 模型绑定属性?
【发布时间】: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; }
}

来源:Microsoft Docs

不带属性的控制器动作方法示例:

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


【解决方案1】:

你可以查看Sources的描述:

默认情况下,模型绑定从 HTTP 请求中的以下来源以键值对的形式获取数据:

  1. 表单域
  2. 请求正文(适用于具有 [ApiController] 属性的控制器。)
  3. 路线数据
  4. 查询字符串参数
  5. 上传的文件

对于每个目标参数或属性,源将按照前面列表中指示的顺序进行扫描。如果默认来源不正确,我们可以使用以下属性之一来指定来源:

  • [FromQuery] - 从查询字符串中获取值。
  • [FromRoute] - 从路线数据中获取值。
  • [FromForm] - 从发布的表单字段中获取值。
  • [FromBody] - 从请求正文中获取值。
  • [FromHeader] - 从 HTTP 标头获取值。

例如:

使用以下方法时,会从表单域中获取宠物数据:

public ActionResult<Pet> Create(Pet pet)

如果使用以下方法,它将从默认来源获取参数。我们可以通过 Form 或 Query 字符串传递参数。

public ActionResult<List<Pet>> Search(string breed, string color, int age)

如果给上面的方法添加属性,像这样:

public ActionResult<List<Pet>> Search([FromQuery]string breed, [FromQuery]string color, [FromQuery]int age)

您只能通过查询字符串传递参数。在这种情况下,如果通过Form传递参数,则action方法中的参数将是Null

因此,通过使用这些属性,我们可以指定模型绑定源,而无需扫描默认源列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多