카테고리 없음

[.그물] 선택적 매개 변수 : "비어 있음"대 "제공되지 않음"

행복을전해요 2021. 1. 27. 05:05

실제로이를 수행하는 방법에는 여러 가지가 있습니다.

  1. @Badri가 제안했듯이 Request작업에서 직접 개체를 사용할 수 있습니다 . 이것은 매우 간단하고 간단한 접근 방식이지만 컨트롤러 로직을 포맷팅 / 바인딩 로직과 혼합합니다. 우려 사항을 더 잘 분리하려면 다음 중 하나를 시도하십시오.
  2. 선택할 수 있는 여러 매개 변수 바인딩 메커니즘 이 있습니다. 이 경우 사용자 정의 모델 바인더가 잘 작동 할 수있는 것 같습니다. Request모델 바인더 개체에 액세스하고 @Badri의 코드와 유사한 것을 사용 하여 작업에 전달되기 전에 예상되는 값 ( String.Empty또는 null) 을 설정할 수 있습니다.
  3. 생년월일 필드에 대한 값 공급자가 더 나은 옵션 일 수 있습니다. 궁극적으로 DateTime 객체로 변환 할 수있는 문자열을 전달합니다. 해당 매개 변수가 사용자 지정 값 공급자 (예 :)를 사용하도록 지정 IntuitiveDateTimeValueProvider하면 실제로 작업의 매개 변수 유형을 DateTime또는 Nullable<DateTime>( DateTime?)로 변경하고 값 공급자가 값을 적절하게 채우도록 할 수 있습니다. 비어있는 것과 널 (예 :)을 구별하려는 더 간단한 문자열에 대해서도 유사한 전략을 사용할 수 있습니다 ExistenceTestingStringValueProvider.
  4. 추가 경로 / 작업을 만듭니다. 가능한 조합이 너무 많기 때문에 매개 변수가 많으면 좋은 옵션이 아니지만, 조합이 적 으면 매우 간단한 솔루션입니다. 이를 수행하는 한 가지 방법은 각 조합에 대해 단순히 메서드 오버로드를 만드는 것입니다. 가있는 오버로드 만 name적중 된 birthdate경우 지정되지 않았 음을 의미 하지만 두 매개 변수가있는 오버로드가 적중 된 birthdate경우 값이 null경우에도 지정 되었음을 의미하므로 지정되었지만 비어있는 매개 변수 값을 구분할 수있는 방법을 제공합니다. 및 지정되지 않은 매개 변수 값.
-------------------

ASP.NET Web API 바인딩을 사용하면 불가능합니다. DTO 클래스가 있고이를 이와 같은 바인딩에 사용합니다.

public class MyDto
{
    public string Name { get; set; }
        public string BirthDate { get; set; }
        }
        
        public void Update([FromUri]MyDto dto) { }
        

생략 BirthDate하거나 빈 값이있는 쿼리 문자열에 포함하면 기본적으로 동일하며 BirthDate두 경우 모두 속성은 null이됩니다. 그러나 이와 같이 쿼리 문자열을 직접 읽을 수 있습니다.

string qs = Request.RequestUri.Query.Substring(1); // leave out ?
var pairs = System.Web.HttpUtility.ParseQueryString(qs);

이 경우 pairs["BirthDate"]쿼리 문자열 (? name = Sherlock)에서 필드를 생략하면 null이됩니다.

빈 값 (? birthdate = & name = Sherlock)이있는 쿼리 문자열에 포함 된 pairs["BirthDate"]경우 빈 문자열 ( "")이됩니다.



출처
https://stackoverflow.com/questions/22029812