ASP.NET Core를 사용하여 쿼리에서 값을 읽는 방법은 무엇입니까?
ASP.NET Core MVC를 사용하는 하나의 RESTful API를 빌드 중이며, 쿼리 매개 변수를 사용하여 컬렉션을 반환하는 리소스에 대한 필터링 및 페이징을 지정합니다.
이 경우 쿼리에 전달 된 값을 읽어서 필터링하고 반환 할 결과를 선택해야합니다.
나는 이미 컨트롤러 내부에서 Get
액세스 하는 액션 HttpContext.Request.Query
이 하나를 반환 했습니다 IQueryCollection
.
문제는 값을 검색하는 데 어떻게 사용하는지 모르겠다는 것입니다. 사실 저는 방법이 예를 들어
string page = HttpContext.Request.Query["page"]
문제는 HttpContext.Request.Query["page"]
패키지를 반환하지 않고 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
그러나 @ 마이크-g 그의 답변에서가 제안했듯이 HttpContext.Request.Query
object-에 직접 액세스하지 않고 모델 바인딩을 사용하는 것이 좋습니다 .
ASP.NET 코어가 자동으로 바인딩 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; }
}
StringValues
인 문자열 배열 . 색인을 제공하여 고급 값을 수 있습니다 (예 : HttpContext.Request.Query["page"][0]
.
IQueryCollection
A는이 TryGetValue()
거기에 그 반환 지정된 키와 값입니다. 다음 someInt
과 같이 사용할 수 있습니다.
var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);
동일한 이름의 매개 변수가 여러 개없는 경우 StringValues
유형은 문제가되지 않습니다.
이 문제에 대한 더 나은 해결책이 있습니다.
- request는 추상 클래스 ControllerBase의 멤버입니다.
- GetSearchParams ()는 벨로우 헬퍼 클래스에서 생성 된 확장 메서드입니다.
var searchparams = await Request.GetSearchParams();
확장 메서드가 거의없는 정적 클래스를 만들었습니다.
public static class HttpRequestExtension
{
public static async Task<SearchParams> GetSearchParams(this HttpRequest request)
{
var parameters = await request.TupledParameters();
try
{
for (var i = 0; i < parameters.Count; i++)
{
if (parameters[i].Item1 == "_count" && parameters[i].Item2 == "0")
{
parameters[i] = new Tuple<string, string>("_summary", "count");
}
}
var searchCommand = SearchParams.FromUriParamList(parameters);
return searchCommand;
}
catch (FormatException formatException)
{
throw new FhirException(formatException.Message, OperationOutcome.IssueType.Invalid, OperationOutcome.IssueSeverity.Fatal, HttpStatusCode.BadRequest);
}
}
public static async Task<List<Tuple<string, string>>> TupledParameters(this HttpRequest request)
{
var list = new List<Tuple<string, string>>();
var query = request.Query;
foreach (var pair in query)
{
list.Add(new Tuple<string, string>(pair.Key, pair.Value));
}
if (!request.HasFormContentType)
{
return list;
}
var getContent = await request.ReadFormAsync();
if (getContent == null)
{
return list;
}
foreach (var key in getContent.Keys)
{
if (!getContent.TryGetValue(key, out StringValues values))
{
continue;
}
foreach (var value in values)
{
list.Add(new Tuple<string, string>(key, value));
}
}
return list;
}
}
이러한 방식으로 모든 검색 매개 변수에 쉽게 액세스 할 수 있습니다. 이것이 많은 개발자에게 도움이되기를 바랍니다. :)
.net 코어에서 뷰에서 쿼리 문자열에 액세스하려면 다음과 같이 사용하십시오.
@Context.Request.Query["yourKey"]
@Context를 사용할 수없는 위치에 있으면 다음과 같이 주입 할 수 있습니다.
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey"))
{
<text>do something </text>
}
또한 쿠키
HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]
'IT' 카테고리의 다른 글
Go에서 마이 구리 프로세스의 stdout 파이프 리디렉션 (0) | 2020.08.26 |
---|---|
모달로 콘텐츠 다시로드 (twitter 부트로 콘텐츠) (0) | 2020.08.26 |
C의 정수 값에서 비트 단위 데이터를 얻으려면 어떻게해야합니까? (0) | 2020.08.26 |
if-elif-else 문을 한 줄에 넣습니다. (0) | 2020.08.26 |
C #의 암호화에서 열거 형 값을 얻는 방법은 무엇입니까? (0) | 2020.08.26 |