0

필자는 해당 매개 변수 중 하나와 함께 ViewModel을 문자열로 기대하는 ActionFilterAttribute를 가지고 있습니다.OnActionExecuting actionContext 바인딩 bool 매개 변수는 문자열로 바뀝니다.

"OnActionExecuting (HttpActionContext actionContext)"메서드에서 읽었습니다.

테스트에서는이 매개 변수를 부울 값으로 보내고 있습니다. 문자열 대신 문자열을 따옴표없이 사용하지만 프레임 워크는이 진리 값을 문자열로 "true"로 자동 변환합니다.

이 입력 매개 변수가 true 또는 "true"인지 확인할 수있는 방법이 있습니까?

+0

는 OnActionExecuting (HttpActionContext ActionContext에)'등이 MVC 또는 WebAPI인가의'WebAPI 필터와'OnActionExecuting (ActionExecutingContext ActionContext에)는 '것입니다 MVC가 될까요? 잘못된 유형의 ActionFilterAttribute가있을 수 있습니다. 이것이 MVC인지 WebAPI인지 알 수 있다면 예제를 드릴 수 있습니다. –

+0

웹 API입니다. 문자열을 기다리고있는 컨트롤러에 부울을 보낼 때 프레임 워크는 진정한 부울을 "실제"문자열로 변환합니다. 나는 이것이 프레임 워크에 의해 상자에서 수행 된 것 같아요하지만 내가 이것을 제어하고 문자열 대신 bool을 보내면 유효성 검사 메시지를 보여주고 싶습니다. – user441365

답변

0

내가 올바르게 이해한다면 실제로 원하는 것은 사용자 정의 모델 바인더라고 생각합니다.

public class NoBooleanModelBinder : IModelBinder 
{ 
    public bool BindModel(
     HttpActionContext actionContext, 
     ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof(string)) 
     { 
      return false; //we only want this to handle string models 
     } 

     //get the value that was parsed 
     string modelValue = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName) 
      .AttemptedValue; 

     //check if that value was "true" or "false", ignoring case. 
     if (modelValue.Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase) || 
      modelValue.Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) 
     { 
      //add a model error. 
      bindingContext.ModelState.AddModelError(bindingContext.ModelName, 
       "Values true/false are not accepted"); 

      //set the value that will be parsed to the controller to null 
      bindingContext.Model = null; 
     } 
     else 
     { 
      //else everything was okay so set the value. 
      bindingContext.Model = modelValue; 
     } 

     //returning true just means that our model binder did its job 
     //so no need to try another model binder. 
     return true; 
    } 
} 

그럼 당신은 당신의 컨트롤러에이 같은 일을 할 수 있습니다

public object Post([ModelBinder(typeof(NoBooleanModelBinder))]string somevalue) 
{ 
    if(this.ModelState.IsValid) { ... } 
} 
+0

아 그렇기 때문에 기본 모델 바인더를 무시해야합니다. 부울을 자동으로 문자열로 변환하지 않으려합니다. 나는이 사건을 어떻게 처리 하는지를보기 위해 소스 코드를 살펴볼 것이다. 덕분에 – user441365

+0

네,이 모델 바인더는 타입이'bindingContext.ModelType! = typeof (string)'인 문자열인지를 검사 할 것입니다. 그런 다음 그 타입이'true'가 아닌 문자열 검사인지 아니면 거짓. –

+0

나는 이것이 과잉이라고 생각하고 값을 허용 할 것이라고 말하고 싶습니다. –