我正在使用ASP构建一个RESTful API。NET Core MVC和我想使用查询字符串参数来指定对返回集合的资源进行过滤和分页。
在这种情况下,我需要读取在查询字符串中传递的值以过滤并选择要返回的结果。
我已经发现在控制器内部的Get动作访问HttpContext.Request.Query返回一个IQueryCollection。
问题是我不知道如何使用它来检索值。事实上,我认为这样做的方法是使用,例如
string page = HttpContext.Request.Query["page"]
问题是HttpContext.Request。查询["page"]不返回字符串,而是返回StringValues。
无论如何,如何使用IQueryCollection来实际读取查询字符串值?
你可以像这样创建一个对象:
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)
to:
[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; }
}
你可以像这样创建一个对象:
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)
to:
[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; }
}
一些评论也提到了这一点,但asp net core会为您完成所有这些工作。
如果您有一个与名称匹配的查询字符串,它将在控制器中可用。
https://myapi/some-endpoint/123?someQueryString=YayThisWorks
[HttpPost]
[Route("some-endpoint/{someValue}")]
public IActionResult SomeEndpointMethod(int someValue, string someQueryString)
{
Debug.WriteLine(someValue);
Debug.WriteLine(someQueryString);
return Ok();
}
Ouputs:
123
YayThisWorks