2012-02-13 3 views
9

제 질문은 매우 간단합니다. 양식을 제출할 때 잘못된 문자 (특히 HTML)가있는 모든 속성 (필드)에 모델 오류로 플래그를 지정하고 싶습니다. 내가 직면하고 문제는 모델 바인딩/검증 전에 에서 요청하는 검증 차기 내가 HTTP 500 ... 나는 당신의 모델/뷰 모델에 [AllowHtml] property 속성을 사용하거나에 <httpRuntime requestValidationMode="2.0" />를 사용하거나 알리는 similar question을 본받을 web.config,하지만 내가 찾고있는 것은 "은 요청 확인 예외를 전역 적으로 catch하여 모델 오류"으로 표시하는 것입니다. 또한 HTML 태그를 "제거"하고 싶지는 않지만 사용자에게 입력 내용이 유효하지 않다는 사실을 알리고 싶습니다.ASP.NET MVC3 요청 유효성 검사 예외를 모델 또는 속성 유효성 검사 오류로 처리하는 방법

나는 정규 표현식 유효성 검사가 잘못된 입력을 찾아 속성을 사용하는 방법에 대한 생각,하지만 난 언급 한 바와 같이 그는 더 - 이동 없도록, ASP.NET MVC3에 요청 유효성 검사는 .../검증 결합 모델 이전에 발생

A 정말 good overview of the Request Validation can be found here입니다.

+0

문제를 알려주십시오. 코드 숨김으로 프라퍼티에 플래그를 지정하고 유효성 검사 오류가있을 때 코드 숨김으로 조작하려고합니다. –

답변

10

모델 바인딩 중에 요청 유효성 검사 예외를 받고 모델 상태 오류로 오류를 표시하는 것이 유일한 방법이라고 생각합니다. 다음은이 모델의 상태에 요청 유효성 검사의 예외를 추가합니다

using System.Web.Helpers; 
    public class MyModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      try 
      { 
       return base.BindModel(controllerContext, bindingContext); 
      } 
      catch(HttpRequestValidationException ex) 
      { 
       var modelState = new ModelState(); 
       modelState.Errors.Add(ex.Message); 
       var key=bindingContext.ModelName; 
       var value = controllerContext.RequestContext.HttpContext.Request.Unvalidated().Form[key]; 
       modelState.Value = new ValueProviderResult(value, value,CultureInfo.InvariantCulture); 
       bindingContext.ModelState.Add(key, modelState); 
      } 
      return null; 
     } 
    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

샘플이다. 죄송합니다, 귀하의 질문을 명확하게 이해하지 못하는 경우.

+0

그것은 작동하지만 다른 속성과 같은 양식에 값을 유지하지 않습니다 ... – zam6ak

+0

@ zam6ak, System.Web.Helpers를 사용하여 추가하고 내 업데이트 된 답변을 참조하십시오. 이것은 단지 빠른 대답 일 뿐이지별로 최적화되지 않았습니다. 그 죄송합니다. –

+0

이것은 멋지게 작동하는 것 같습니다. 왜 내가 "매우 최적화되어 있지 않다"는 것을 말하는지 모르겠습니다. :) – zam6ak