FromQueryAttribute 实际上是如何工作的以及为什么我需要它?

Mis*_*tan 4 c# asp.net-mvc .net-core asp.net-core

我正在使用一些预先存在的代码,这些代码使用 HttpGet 端点来获取所有评论。它需要一些默认参数,并且在每个参数之前都用一个[FromQuery]属性进行修饰。我有点困惑为什么我们需要这个以及它对我真正有什么作用。

我在网上找到的只有这个文档:(https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.fromqueryattribute?view=aspnetcore-2.2

但这并不能回答我的问题......

  • 什么是查询字符串?
  • 它如何在端点中使用?
  • 什么时候我不需要指定这个属性?我认为它的使用不多。
[HttpGet]
[ProducesResponseType(typeof(FooResponse), 200),
public async Task<ActionResult<FooResponse>> GetAll([FromQuery]string sortColumn = "CommentId",
    [FromQuery]SortDirections sortDirection = SortDirections.Asc, 
    [FromQuery]string filter = "", 
    [FromQuery]int page = 1, 
    [FromQuery]int pageSize = 10)
{
    var data = await _mediator.Send(new GetAllComments(sortColumn, sortDirection, filter, page, pageSize));
.
.
.
    return Ok(data);
}
Run Code Online (Sandbox Code Playgroud)

我怀疑它与传递到 URL 的内容有关,但我不太确定......

Chr*_*att 5

这里的用法是多余的。该操作的功能相同,无需[FromQuery]应用于所有参数,因为它仅响应 GET 请求。

什么是查询字符串?

?查询字符串是应用该字符后的 URI 部分。它构成 URI 的数据部分与纯路由部分。

它如何在端点中使用?

这里的问题有点微妙,所以更合适的问题是“它是如何在请求中使用的?” 答案是它是一种将数据与 GET 请求一起传递到特定 URI 的方法。与其他 HTTP 方法不同,GET 并不真正允许请求“正文”。(实际上,规范在技术上确实允许这样,但几乎普遍不以这种方式实现。)

什么时候我不需要指定这个属性?我认为它的使用不多。

同样,更好的问题是“我什么时候真正需要指定此属性?” 答案基本上是当数据来自哪里不明确时。对于其他 HTTP 方法(例如 POST),这几乎总是如此。默认情况下,数据预计来自请求正文,并且根据该请求正文的内容类型,绑定预计为 或FromFormFromBody这通常是此处 params 的默认值。(默认值取决于您正在处理传统的 MVC 样式控制器还是 API 样式控制器。)如果您需要在这种情况下从查询字符串而不是主体中实际获取特定参数,那么您可以将该[FromQuery]属性应用于该特定参数。