web-dev-qa-db-ja.com

ASP.NET Coreでクエリ文字列から値を読み取る方法は?

私は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を使うのですか?

80
user1620696

特定のモデルをクエリ文字列にバインドするために[FromQuery]を使うことができます。

https://docs.Microsoft.com/ja-jp/aspnet/core/mvc/models/model-binding

例えば.

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

単一のIQueryCollectionパラメータが指定されている場合は、pageに対してToStringメソッドを使用して目的の値を返すことができます。

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

?page=1&page=2のように複数の値がある場合、ToString呼び出しの結果は1,2になります。

しかし、@ mike-gが彼の答えで示唆したように、あなたはHttpContext.Request.Queryオブジェクトに直接アクセスするのではなくモデルバインディングを使うほうが良いでしょう。

64
Darin Dimitrov

ASP.NET Coreは自動的にform valuesroute valuesおよびquery stringsを名前でバインドします。これはあなたが単にこれを行うことができることを意味します:

[HttpGet()]
public IActionResult Get(int page)
{ ... }

MVCはリクエストデータを名前でアクションパラメータにバインドしようとします...以下はモデルバインディングがそれらを通して見る順番でデータソースのリストです

  1. Form values:これらはPOSTメソッドを使用してHTTPリクエストに入るフォーム値です。 (jQuery POST要求を含む).

  2. Route values:Routingによって提供された一連の経路値

  3. Query strings:URIのクエリ文字列部分.

出典: モデルバインディングのしくみ


参考までに、自動アプローチと明示的アプローチを組み合わせることもできます。

[HttpGet()]
public IActionResult Get(int page
     , [FromQuery(Name = "page-size")] int pageSize)
{ ... }
14
spottedmahn

これは私が(.NET Coreビューで)使ったコードサンプルです。

@{
    Microsoft.Extensions.Primitives.StringValues queryVal;

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

このようなオブジェクトを作成するだけです。

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

IQueryCollectionにはTryGetValue()があり、与えられたキーで値を返します。 someIntという名前のクエリパラメータがある場合は、そのように使用できます。

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

同じ名前のパラメータが複数ある場合を除き、StringValues型は問題にならないことに注意してください。

6
steamrolla

StringValuesは文字列の 配列です 。あなたは、インデックスを提供することによってあなたの文字列値を得ることができます。 HttpContext.Request.Query["page"][0]

6
Constantinos G.

あなたは私たちの見解でクエリ文字列にアクセスしたい場合は。

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

クッキーにも

HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]
0
M.Ali El-Sayed