我正在使用一些预先存在的代码,这些代码使用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的内容有关,但我不太确定...
答案 0 :(得分:1)
由于您帖子中的操作仅适用于GET请求([HttpGet]),因此不需要[FromQuery]-参数将自动使用关联的查询字符串值。
对于POST操作([HttpPost]),此属性指定从查询字符串中获取值而不是已发布的数据。
答案 1 :(得分:1)
这里的用法是多余的。该动作将起到相同的作用,而不会将[FromQuery]
应用于所有参数,因为它仅响应GET请求。
什么是查询字符串?
查询字符串是应用?
字符后URI的一部分。与纯路由部分相比,它构成了URI的数据部分。
它在端点中如何使用?
这里的问题有点棘手,所以问“在请求中如何使用它”会更合适。答案是,这是一种将数据与GET请求一起传递到特定URI的方法。与其他HTTP方法不同,GET确实不允许请求“正文”。 (实际上,规范在技术上是 允许这样做,但是几乎没有这样普遍实现。)
什么时候不需要指定此属性?我看不到它使用得太多。
同样,更好的问题是“我何时真正需要指定此属性?”答案基本上是当数据的来源不明确时。这几乎总是与其他HTTP方法(例如POST)一起使用。默认情况下,数据应该来自那里的请求正文,并且根据该请求正文的内容类型,绑定应该是FromForm
或FromBody
,通常是默认的那里的参数。 (默认值取决于您要使用的是传统的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
。