私はASP.NET Core MVCを使用して1つのRESTful APIを構築しています。コレクションを返すリソースのフィルタリングとページングを指定するためにクエリ文字列パラメータを使用したいです。
その場合は、クエリ文字列で渡された値を読み取ってフィルタリングし、返される結果を選択する必要があります。
HttpContext.Request.Query
にアクセスするコントローラのGet
アクションが1つのIQueryCollection
を返すことを私はすでに知っています。
問題は、値を取得するためにそれがどのように使われているのかわからないということです。実のところ、私はやるべきことは、例えば
string page = HttpContext.Request.Query["page"]
問題はHttpContext.Request.Query["page"]
が文字列を返さず、StringValues
を返すことです。
とにかく、実際にクエリ文字列の値を読むためにどうやってIQueryCollection
を使うのですか?
特定のモデルをクエリ文字列にバインドするために[FromQuery]
を使うことができます。
https://docs.Microsoft.com/ja-jp/aspnet/core/mvc/models/model-binding
例えば.
[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}
単一のIQueryCollection
パラメータが指定されている場合は、page
に対してToStringメソッドを使用して目的の値を返すことができます。
string page = HttpContext.Request.Query["page"].ToString();
?page=1&page=2
のように複数の値がある場合、ToString呼び出しの結果は1,2
になります。
しかし、@ mike-gが彼の答えで示唆したように、あなたはHttpContext.Request.Query
オブジェクトに直接アクセスするのではなくモデルバインディングを使うほうが良いでしょう。
ASP.NET Coreは自動的にform values
、route values
およびquery strings
を名前でバインドします。これはあなたが単にこれを行うことができることを意味します:
[HttpGet()]
public IActionResult Get(int page)
{ ... }
MVCはリクエストデータを名前でアクションパラメータにバインドしようとします...以下はモデルバインディングがそれらを通して見る順番でデータソースのリストです
Form values
:これらはPOSTメソッドを使用してHTTPリクエストに入るフォーム値です。 (jQuery POST要求を含む).
Route values
:Routingによって提供された一連の経路値
Query strings
:URIのクエリ文字列部分.
出典: モデルバインディングのしくみ
参考までに、自動アプローチと明示的アプローチを組み合わせることもできます。
[HttpGet()]
public IActionResult Get(int page
, [FromQuery(Name = "page-size")] int pageSize)
{ ... }
これは私が(.NET Coreビューで)使ったコードサンプルです。
@{
Microsoft.Extensions.Primitives.StringValues queryVal;
if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
queryVal.FirstOrDefault() == "yourValue")
{
}
}
このようなオブジェクトを作成するだけです。
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; }
}
IQueryCollection
にはTryGetValue()
があり、与えられたキーで値を返します。 someInt
という名前のクエリパラメータがある場合は、そのように使用できます。
var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);
同じ名前のパラメータが複数ある場合を除き、StringValues
型は問題にならないことに注意してください。
StringValues
は文字列の 配列です 。あなたは、インデックスを提供することによってあなたの文字列値を得ることができます。 HttpContext.Request.Query["page"][0]
。
あなたは私たちの見解でクエリ文字列にアクセスしたい場合は。
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey "))
{
<text>do something </text>
}
クッキーにも
HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]