问题描述
我们应该出于什么原因在 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)
解决方法
您可以查看 Sources 说明:
默认情况下,模型绑定从 HTTP 请求中的以下来源以键值对的形式获取数据:
- 表单域
- 请求正文(对于具有 [ApiController] 属性的控制器。)
- 路线数据
- 查询字符串参数
- 上传的文件
对于每个目标参数或属性,源按照前面列表中指示的顺序进行扫描。如果默认来源不正确,我们可以使用以下属性之一来指定来源:
- [FromQuery] - 从查询字符串中获取值。
- [FromRoute] - 从路由数据中获取值。
- [FromForm] - 从发布的表单字段中获取值。
- [FromBody] - 从请求正文中获取值。
- [FromHeader] - 从 HTTP 标头中获取值。
例如:
当使用以下方法时,它将从表单字段中获取宠物数据:
SELECTION-LIST
如果使用以下方法,它将从默认来源获取参数。我们可以通过 Form 或 Query 字符串传递参数。
public ActionResult<Pet> Create(Pet pet)
如果给上面的方法添加属性,像这样:
public ActionResult<List<Pet>> Search(string breed,string color,int age)
您只能通过查询字符串传递参数。在这种情况下,如果通过Form传递参数,action方法中的参数将是public ActionResult<List<Pet>> Search([FromQuery]string breed,[FromQuery]string color,[FromQuery]int age)
。
因此,通过使用这些属性,我们可以指定模型绑定源,而无需扫描默认源列表。