当前位置:  开发笔记 > 编程语言 > 正文

如何使用ASP.NET Core从查询字符串中读取值?

如何解决《如何使用ASP.NETCore从查询字符串中读取值?》经验,为你挑选了7个好方法。

我正在使用ASP.NET Core MVC构建一个RESTful API,我想使用查询字符串参数来指定返回集合的资源上的过滤和分页.

在这种情况下,我需要读取查询字符串中传递的值来过滤并选择要返回的结果.

我已经发现控制器Get操作内部访问HttpContext.Request.Query返回一个IQueryCollection.

问题是我不知道如何使用它来检索值.事实上,我认为要做的方法是使用,例如

string page = HttpContext.Request.Query["page"]

问题是HttpContext.Request.Query["page"]不返回字符串,而是返回StringValues.

无论如何,如何使用它IQueryCollection来实际读取查询字符串值?



1> Mike_G..:

您可以使用[FromQuery]将特定模型绑定到查询字符串:

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

例如

[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}


(Name ="page")是不必要的 - 如果命名相同,它将绑定到变量
我认为`[FromQuery]`attrib也可以省略,因为.net绑定默认会检查所有表单输入和url querystring参数,除了你有一些限制其来源的理由.

2> Darin Dimitr..:

IQueryCollection如果page指定了单个参数,您可以使用ToString方法返回所需的值:

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

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

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


ToString不是必需的.如果将查询值分配给字符串,编译器将隐式转换它.

3> spottedmahn..:

ASP.NET核心会自动绑定form values,route valuesquery 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)
{ ... }



4> Pavel..:

这是我使用过的代码示例(带有.NET Core视图):

@{
    Microsoft.Extensions.Primitives.StringValues queryVal;

    if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
        queryVal.FirstOrDefault() == "yourValue")
    {
    }
}



5> Mariusz..:

您可以像这样创建一个对象:

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; }
}



6> Constantinos..:

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



7> steamrolla..:

IQueryCollection有一个TryGetValue()使用给定键返回值的on.所以,如果你有一个调用的查询参数someInt,你可以像这样使用它:

var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);

请注意,除非您有多个同名参数,否则StringValues类型不是问题.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有