IT

ASP.NET Core를 사용하여 쿼리에서 값을 읽는 방법은 무엇입니까?

lottoking 2020. 8. 26. 08:07
반응형

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.Queryobject-에 직접 액세스하지 않고 모델 바인딩을 사용하는 것이 좋습니다 .


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: Routing에서 제공하는 경로 값 세트

  3. 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].


IQueryCollectionA는이 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"]

참고 URL : https://stackoverflow.com/questions/41577376/how-to-read-values-from-the-querystring-with-asp-net-core

반응형