我正在使用ASP.NET Core MVC构建一个RESTful API,我想使用查询字符串参数来指定返回集合的资源上的过滤和分页.
在这种情况下,我需要读取查询字符串中传递的值来过滤并选择要返回的结果.
我已经发现控制器Get
操作内部访问HttpContext.Request.Query
返回一个IQueryCollection
.
问题是我不知道如何使用它来检索值.事实上,我认为要做的方法是使用,例如
string page = HttpContext.Request.Query["page"]
问题是HttpContext.Request.Query["page"]
不返回字符串,而是返回StringValues
.
无论如何,如何使用它IQueryCollection
来实际读取查询字符串值?
您可以使用[FromQuery]
将特定模型绑定到查询字符串:
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
例如
[HttpGet()] public IActionResult Get([FromQuery(Name = "page")] string page) {...}
IQueryCollection
如果page
指定了单个参数,您可以使用ToString方法返回所需的值:
string page = HttpContext.Request.Query["page"].ToString();
如果有多个值,?page=1&page=2
那么ToString调用的结果将是1,2
但正如@ mike-g在他的回答中建议的那样,你最好使用模型绑定而不是直接访问HttpContext.Request.Query
对象.
ASP.NET核心会自动绑定form values
,route values
并query strings
通过名称.这意味着你可以简单地这样做:
[HttpGet()]
public IActionResult Get(int page)
{ ... }
MVC将尝试通过名称将请求数据绑定到操作参数...下面是模型绑定通过它们查找的顺序中的数据源列表
Form values
:这些是使用POST方法在HTTP请求中的表单值.(包括jQuery POST请求).
Route values
:路由提供的路由值集
Query strings
:URI的查询字符串部分.
来源:模型绑定的工作原理
仅供参考,您还可以结合自动和显式方法:
[HttpGet()]
public IActionResult Get(int page
, [FromQuery(Name = "page-size")] int pageSize)
{ ... }
这是我使用过的代码示例(带有.NET Core视图):
@{ Microsoft.Extensions.Primitives.StringValues queryVal; if (Context.Request.Query.TryGetValue("yourKey", out queryVal) && queryVal.FirstOrDefault() == "yourValue") { } }
您可以像这样创建一个对象:
public class SomeQuery { public string SomeParameter { get; set; } public int? SomeParameter2 { get; set; } }
然后在控制器中进行如下操作:
[HttpGet] public IActionResult FindSomething([FromQuery] SomeQuery query) { // Your implementation goes here.. }
更好的是,您可以通过以下方式创建API模型:
[HttpGet] public IActionResult GetSomething([FromRoute] int someId, [FromQuery] SomeQuery query)
至:
[HttpGet] public IActionResult GetSomething(ApiModel model) public class ApiModel { [FromRoute] public int SomeId { get; set; } [FromQuery] public string SomeParameter { get; set; } [FromQuery] public int? SomeParameter2 { get; set; } }
StringValues
是一个字符串数组。您可以通过提供索引来获取字符串值,例如HttpContext.Request.Query["page"][0]
。
IQueryCollection
有一个TryGetValue()
使用给定键返回值的on.所以,如果你有一个调用的查询参数someInt
,你可以像这样使用它:
var queryString = httpContext.Request.Query; StringValues someInt; queryString.TryGetValue("someInt", out someInt); var daRealInt = int.Parse(someInt);
请注意,除非您有多个同名参数,否则StringValues
类型不是问题.