2014-10-14 4 views
10

가 나는 WebApi 방법이 바인딩 :사용자 정의 부울 매개 변수 이것처럼,

public string Get([FromUri] SampleInput input) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

을 입력은 다음과 같이 정의된다 : 그대로

public class SampleInput 
{ 
    // ...other fields 
    public bool IsAwesome { get; set; } 
} 

, 그것은 확인을 작동 : 나는 &isAwesome=true를 통과하면 쿼리 문자열에서 매개 변수는 값 true으로 초기화됩니다.

내 문제는 &isAwesome=true&isAwesome=1을 모두 true 값으로 받아들이고 싶습니다. 현재 두 번째 버전은 입력 모델에서 IsAwesomefalse이됩니다. 사용 Global.asax.cs을

public class BooleanNumericParameterBinding : HttpParameterBinding 
{ 
    private static readonly HashSet<string> TrueValues = 
     new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase); 

    public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor) 
    { 
    } 

    public override Task ExecuteBindingAsync(
     ModelMetadataProvider metadataProvider, 
     HttpActionContext actionContext, 
     CancellationToken cancellationToken) 
    { 
     var routeValues = actionContext.ControllerContext.RouteData.Values; 

     var value = (routeValues[Descriptor.ParameterName] ?? 0).ToString(); 

     return Task.FromResult(TrueValues.Contains(value)); 
    } 
} 

... 그리고 에 등록 : I 시도 무엇


은 주제에 다양한 블로그 게시물을 읽어 후, HttpParameterBinding을 정의하는 것이 었습니다 :

var pb = GlobalConfiguration.Configuration.ParameterBindingRules; 
pb.Add(typeof(bool), p => new BooleanNumericParameterBinding(p)); 

var pb = GlobalConfiguration.Configuration.ParameterBindingRules; 
pb.Insert(0, typeof(bool), p => new BooleanNumericParameterBinding(p)); 

이들 중 아무 것도 작동하지 않았습니다. 내 사용자 지정 HttpParameterBinding이 호출되지 않고 여전히 1false으로 변환되었습니다.

부울에 대해 1true으로 허용하도록 WebAPI를 구성하려면 어떻게해야합니까?

편집 : 제시된 예는 의도적으로 단순화되었습니다. 내 응용 프로그램에서 많은 입력 모델을 가지고 있으며 위에서 설명한 방법으로 처리하고 싶은 부울 필드가 많이 있습니다. 이 분야가 하나만 있다면 그러한 복잡한 메커니즘에 의지하지 않았을 것입니다.

+0

나는'SampleAutes'에서'IsAwesome1'이라는 readonly 속성을 만들고 문자열로'IsAwesome'을 만들고, IsAwesome' =''1 '''또는''true 인 경우에만'IsAwesome1' = "' –

+0

@ArindamNayak 예제 에서처럼 너무 많은 필드가 너무 많아서 코드가 부 풀릴 것입니다. 웹 API에서보다 우아한 방법이 있다고 생각했습니다.나는 MVC로 잠시 되돌아 가고있다. 나는 일을 잘하는'IModelBinder'를 가지고있다. – GolfWolf

답변

4

FromUriAttribute으로 매개 변수를 꾸미는 것처럼 보이면 매개 변수 바인딩 규칙을 건너 뜁니다.

public string Get([FromUri] bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

여전히라고 점점되지 부울 규칙 (당신이 &isAwesome=1를 호출 할 때 IsAwesomenull로오고) : 나는 간단한 bool으로 SampleInput 입력 매개 변수를 대체하는 간단한 테스트를했다. 당신이 FromUri 특성을 제거하자마자 :

public string Get(bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

이 규칙이 호출되는 및 매개 변수가 올바르게 바인딩. FromUriAttribute 클래스는 봉인되었으므로 여러분이 꽤 망쳐 놓은 것 같아요. 언제든지 다시 구현할 수 있고 대체 부울 바인딩 논리를 포함 할 수 있습니다^_ ^.