ASP.NET Core MVC를 사용하여 하나의 RESTful API를 작성 중이며 querystring 매개 변수를 사용하여 컬렉션을 반환하는 리소스에 대한 필터링 및 페이징을 지정하려고합니다.
이 경우 쿼리 문자열에 전달 된 값을 읽어서 필터링 할 결과를 선택해야합니다.
컨트롤러 Get
액션에 액세스 하면 HttpContext.Request.Query
one 반환 한다는 것을 이미 알았습니다 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는 요청 데이터를 이름별로 작업 매개 변수에 바인딩하려고 시도합니다. 아래는 모델 바인딩이 보는 순서대로 데이터 소스 목록입니다.
Form values
: POST 메소드를 사용하여 HTTP 요청에 들어가는 양식 값입니다. (jQuery POST 요청 포함).
Route values
: 라우팅에서 제공하는 라우트 값 세트
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]
.
답변
IQueryCollection
TryGetValue()
주어진 키로 값을 반환 하는 on이 있습니다. 따라서이라는 검색어 매개 변수가있는 경우 다음 someInt
과 같이 사용할 수 있습니다.
var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);
같은 이름의 여러 매개 변수 StringValues
가 없으면 유형에 문제가 없습니다.