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

use*_*696 102 c# http query-string .net-core asp.net-core

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

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

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

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

string page = HttpContext.Request.Query["page"]
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*e_G 101

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

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

例如

[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}
Run Code Online (Sandbox Code Playgroud)

  • (Name ="page")是不必要的 - 如果命名相同,它将绑定到变量 (7认同)
  • 我认为`[FromQuery]`attrib也可以省略,因为.net绑定默认会检查所有表单输入和url querystring参数,除了你有一些限制其来源的理由. (4认同)
  • 如果查询字符串参数名称是结构化的,这一点很重要。例如“object.propname” (3认同)

Dar*_*rov 71

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

string page = HttpContext.Request.Query["page"].ToString();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 添加 ToString() 甚至很危险。如果 URL 没有查询字符串 ID,则返回值为 null(https://learn.microsoft.com/en-us/dotnet/api/system.web.httprequest.querystring?view=netframework-4.8 #examples )并导致 NullReference 异常。 (7认同)
  • ToString不是必需的.如果将查询值分配给字符串,编译器将隐式转换它. (4认同)
  • @MichaelFreidgeim 不,它不是,不,它不会,`StringValues` 是一个结构,它不能为空,此外您的链接指向 NET Framework 文章。 (2认同)
  • @AlexfromJitbit,你是对的,在 Asp.Net Core 中,如果键不存在,它会返回 StringValues.Empty 。https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.iquerycollection.item?view=aspnetcore-7.0#microsoft-aspnetcore-http-iquerycollection-item(系统字符串) (2认同)

spo*_*ahn 19

ASP.NET核心会自动绑定form values,route valuesquery strings通过名称.这意味着你可以简单地这样做:

[HttpGet()]
public IActionResult Get(int page)
{ ... }
Run Code Online (Sandbox Code Playgroud)

MVC将尝试通过名称将请求数据绑定到操作参数...下面是模型绑定通过它们查找的顺序中的数据源列表

  1. Form values:这些是使用POST方法在HTTP请求中的表单值.(包括jQuery POST请求).

  2. Route values:路由提供的路由值集

  3. Query strings:URI的查询字符串部分.

来源:模型绑定的工作原理


仅供参考,您还可以结合自动和显式方法:

[HttpGet()]
public IActionResult Get(int page
     , [FromQuery(Name = "page-size")] int pageSize)
{ ... }
Run Code Online (Sandbox Code Playgroud)

  • 虽然这不是操作员问题的答案,但对于那些出于类似原因来到这里的人来说,这是一个非常有用的答案。 (4认同)

Pav*_*vel 14

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

@{
    Microsoft.Extensions.Primitives.StringValues queryVal;

    if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
        queryVal.FirstOrDefault() == "yourValue")
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 支持包含完整的对象名称(或正确的 using 语句)。当人们只放置对象名而没有完全限定或至少有一个 using 语句时,这让我发疯。谢谢。 (10认同)

Mar*_*usz 11

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

public class SomeQuery
{
    public string SomeParameter { get; set; }
    public int? SomeParameter2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中进行如下操作:

[HttpGet]
public IActionResult FindSomething([FromQuery] SomeQuery query)
{
    // Your implementation goes here..
}
Run Code Online (Sandbox Code Playgroud)

更好的是,您可以通过以下方式创建API模型:

[HttpGet]
public IActionResult GetSomething([FromRoute] int someId, [FromQuery] SomeQuery query)
Run Code Online (Sandbox Code Playgroud)

至:

[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; }
}
Run Code Online (Sandbox Code Playgroud)


Con*_* G. 8

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

  • 谢谢; 这是实际回答问题的唯一答复。(在我的情况下,我不能使用绑定,因为我有一个更复杂的逻辑,比如“首先尝试查询字符串,如果缺少则尝试会话等等”。) (2认同)

ste*_*lla 6

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

var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);
Run Code Online (Sandbox Code Playgroud)

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


M.A*_*yed 6

在 .net core 中,如果您想在我们的视图中访问查询字符串,请使用它

@Context.Request.Query["yourKey"]
Run Code Online (Sandbox Code Playgroud)

如果我们在 @Context 不可用的位置,我们可以像这样注入它

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey"))
{
      <text>do something </text>
}
Run Code Online (Sandbox Code Playgroud)

也用于饼干

HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]
Run Code Online (Sandbox Code Playgroud)

  • 不需要所有这些代码。只需使用 @Context.Request.Query["yourKey"] (2认同)

小智 6

也许它有帮助。在视图中获取查询字符串参数

看法:

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@{ Context.Request.Query["uid"]}
Run Code Online (Sandbox Code Playgroud)

Startup.cs 配置服务:

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)