[C#] ASP.NET Core를 사용하여 쿼리 문자열에서 값을 읽는 방법은 무엇입니까?

ASP.NET Core MVC를 사용하여 하나의 RESTful API를 작성 중이며 querystring 매개 변수를 사용하여 컬렉션을 반환하는 리소스에 대한 필터링 및 페이징을 지정하려고합니다.

이 경우 쿼리 문자열에 전달 된 값을 읽어서 필터링 할 결과를 선택해야합니다.

컨트롤러 Get액션에 액세스 하면 HttpContext.Request.Queryone 반환 한다는 것을 이미 알았습니다 IQueryCollection.

문제는 값을 검색하는 데 어떻게 사용되는지 모른다는 것입니다. 사실, 나는하는 방법이 예를 들어

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

문제는 HttpContext.Request.Query["page"]문자열을 반환하지 않지만 a StringValues입니다.

어쨌든 어떻게 IQueryCollection실제로 쿼리 문자열 값을 읽는 데 사용 합니까?



답변

[FromQuery]특정 모델을 쿼리 문자열에 바인딩하는 데 사용할 수 있습니다 .

https://docs.microsoft.com/en-us/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 코어가 자동으로 바인딩 form values, route values그리고 query strings이름. 이것은 단순히 당신이 이것을 할 수 있음을 의미합니다 :

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

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)
{ ... }


답변

다음과 같이 객체를 만들 수 있습니다.

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


답변

다음은 .NET Core 뷰와 함께 사용한 코드 샘플입니다.

@{
    Microsoft.Extensions.Primitives.StringValues queryVal;

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


답변

StringValues문자열 배열 . 색인을 제공하여 문자열 값을 얻을 수 있습니다 (예 🙂 HttpContext.Request.Query["page"][0].


답변

IQueryCollectionTryGetValue()주어진 키로 값을 반환 하는 on이 있습니다. 따라서이라는 검색어 매개 변수가있는 경우 다음 someInt과 같이 사용할 수 있습니다.

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

같은 이름의 여러 매개 변수 StringValues가 없으면 유형에 문제가 없습니다.