FromQueryAttribute实际如何工作,为什么需要它?

时间:2019-04-03 16:27:56

标签: c# asp.net-mvc asp.net-core .net-core

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

我所能找到的只是这份文档,在线上很少: (https://docs.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);
    }
    

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

3 个答案:

答案 0 :(得分:1)

由于您帖子中的操作仅适用于GET请求([HttpGet]),因此不需要[FromQuery]-参数将自动使用关联的查询字符串值。

对于POST操作([HttpPost]),此属性指定从查询字符串中获取值而不是已发布的数据。

答案 1 :(得分:1)

这里的用法是多余的。该动作将起到相同的作用,而不会将[FromQuery]应用于所有参数,因为它仅响应GET请求。

  

什么是查询字符串?

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

  

它在端点中如何使用?

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

  

什么时候不需要指定此属性?我看不到它使用得太多。

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

答案 2 :(得分:0)

查询字符串是URL中位于?之后的一部分,它提供了一种将值作为键值对列表传递的方式,每对键值之间用&字符分隔。假设您有以下网址:

http://mywebsite.com/somePage?a=123&b=Hello&c=World

因此该URL对应于a=123&b=Hello&c=World的查询字符串部分int,并且传递的键值对列表为:

a = 123
b = Hello
c = World

ASP.NET Core可以通过许多不同的方式将值绑定到变量,其中之一是通过从查询字符串中读取值并将这些值转换/分配为API方法的值。要指定参数应来自查询字符串,请使用[FromQuery]属性。

因此-例如-当您拥有[FromQuery]string sortColumn = "CommentId"时,基本上是在告诉它从查询字符串中读取sortColumn键,并将其分配给{{1 }}方法,如果查询字符串中不存在该“ sortColumn”键,则应为其分配默认的“ CommentId”值。它与其他参数相似。

因此,您可以使用类似的内容访问该URL(您应使用正确的URL来获取GetAll方法,而我提供的代码无法告诉您):

sortColumn

GetAll()参数的值设为http://your-system-url-here/GetAll?page=2&pageSize=20,将page参数的值设为2