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)
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对象.
spo*_*ahn 19
ASP.NET核心会自动绑定form values,route values并query strings通过名称.这意味着你可以简单地这样做:
[HttpGet()]
public IActionResult Get(int page)
{ ... }
Run Code Online (Sandbox Code Playgroud)
MVC将尝试通过名称将请求数据绑定到操作参数...下面是模型绑定通过它们查找的顺序中的数据源列表
Form values:这些是使用POST方法在HTTP请求中的表单值.(包括jQuery POST请求).
Route values:路由提供的路由值集
Query strings:URI的查询字符串部分.
来源:模型绑定的工作原理
仅供参考,您还可以结合自动和显式方法:
[HttpGet()]
public IActionResult Get(int page
, [FromQuery(Name = "page-size")] int pageSize)
{ ... }
Run Code Online (Sandbox Code Playgroud)
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)
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)
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类型不是问题.
在 .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)
小智 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)
| 归档时间: |
|
| 查看次数: |
135242 次 |
| 最近记录: |