2014-02-25 3 views
3

빈 값과 전혀 언급되지 않은 값을 구별하는 방법이 있습니까?선택적 매개 변수 : "비어 있음"vs "제공되지 않음"

예를 들어 클라이언트에게 프로필을 업데이트하고 요청에 지정된 값에만 영향을 주길 원합니다. EVEN empty/null ones.

POST api/profiles/update?name=Sherlock >> only modifies name 

POST api/profiles/update?birthdate=&name=Sherlock >> modifies name AND clears birthdate 

그 두 상황에서 생년월일 매개 변수를 구별 할 수있는 방법이 있나요, 아니면 내가 의지해야합니까 :

그래서 이름 = "Sherlok"및 생년월일 = "1월 6일"로 프로필을 제공 마술 가치?

답변

0

ASP.NET 웹 API 바인딩을 사용하는 경우에는 불가능합니다. 말하자면, DTO 클래스를 가지고 이와 같이 바인딩에 사용합니다. 당신이 BirthDate을 떠나거나 빈 값으로 쿼리 문자열에있을 때

public class MyDto 
{ 
    public string Name { get; set; } 
    public string BirthDate { get; set; } 
} 

public void Update([FromUri]MyDto dto) { } 

, 그것은 기본적으로 동일하고 BirthDate 속성은 두 경우 모두 null이됩니다. 그러나 이와 같이 쿼리 문자열을 직접 읽을 수 있습니다. 쿼리 문자열 (? 이름 = 셜록)에서 필드를 생략하는 경우이 경우

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

, pairs["BirthDate"]는, null가됩니다.

검색어 문자열에 빈 값 (? birthdate = & 이름 = Sherlock)이 있으면 은 빈 문자열 ("")이됩니다.

0

실제로 이렇게하는 데는 몇 가지 방법이 있습니다.

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