我正在使用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; }
}

你可以在IQueryCollection上使用ToString方法,如果指定了单个页面参数,它将返回所需的值:

string page = HttpContext.Request.Query["page"].ToString();

如果有多个值,比如?page=1&page=2,那么ToString调用的结果将是1,2

但是正如@mike-g在他的回答中建议的那样,你最好使用模型绑定,而不是直接访问HttpContext.Request.Query对象。

添加此服务 服务。AddSingleton < IHttpContextAccessor, HttpContextAccessor > (); 你的视图add inject @inject Microsoft.AspNetCore.Http.IHttpContextAccessor 获得你的价值

Code

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@{
    var id = HttpContextAccessor.HttpContext.Request.RouteValues["id"];

    if (id != null)
    {
        // parameter exist in your URL 
    }
}

一些评论也提到了这一点,但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

StringValues是一个字符串数组。你可以通过提供一个索引来获取你的字符串值,例如HttpContext.Request.Query["page"][0]。