2013-10-29 3 views
1

숫자 필드에 대한 MVC 유효성 검사의 기본 동작을 무시할 수없는 방법으로 보일 수 없습니다.MVC 숫자 유효성 검사

문제점을 나타 내기 위해 기본 MVC4 프로젝트를 만들었습니다.

모델 (기본 MVC 당신을 위해 4 명 구조, 플러스 두 가지 속성 "나이"와 "날짜") :

는 기본적으로 그래서
[Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

    public DateTime Date { get; set; } 

    public int Age { get; set; } 

가 MVC 내가 만든 두 개의 필드를 확인하고 난 다음 유효성 검사 메시지가 나타납니다. "필드"나이 "필요합니다."및 "필드"날짜 "필요합니다.

지금 달성하기 위해 응용 프로그램을 기본 숫자 유효성 검사를 무시하도록 강요합니다. 클라이언트 쪽에서이 작업을 수행하면 사용자가 잘못된 값을 입력하는 것은 불가능합니다.) MVC가 Nullable 속성에 대한 기본 "필수"속성을 추가하지 않도록 시도했습니다.

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

이것은 약간의 진전을 가져 왔습니다. 이제는 "필수"유효성 검사를 수행하지 않지만 양식을 게시하면 동일한 값의 유효성 검사 메시지가 두 번 나타납니다. "값이 필요합니다".

나는이 시점을 넘어서 아무것도 달성하지 못했습니다. 나는 ClientDataTypeModelValidatorProvider

 foreach (ModelValidatorProvider prov in ModelValidatorProviders.Providers) 
     { 
      if (prov.GetType().Equals(typeof(ClientDataTypeModelValidatorProvider))) 
      { 
       break; 
      } 
     } 

뿐만 아니라 성공없이 모두

ModelValidatorProviders.Providers.Clear(); 

모든 공급자를 제거하는 시도했습니다.

또한 MVA가 DataAnnotationsModelValidatorProvider에서 사용하는 기본 속성 중 일부를 오버로드하려고했지만 결과가 없습니다.

  1. 이 가능 null이 허용되지 않는 데이터 유형에 대한 서버 측에서 기본 유효성 검사를 수행하지 MVC를 강제하는 것입니다 :

    그래서 질문 몇 내가이 상황에 대해 묻고 싶습니다 있는가? 가능한 경우 어떻게?

  2. 1 번 질문에 설명 된 유효성 검사의 기본 동작을 변경할 수 있습니까? 가능하다면 - 어떻게?
  3. MVC가이 사용자 지정 유효성 검사기 대신 사용자 지정 유효성 검사기/유효성 검사 특성을 사용하도록 할 수 있습니까? 가능하다면 - 어떻게? 또한

노트 : 나는 하지 나를 위해 검증을 수행 내 속성을 작성하고이에 대한 검증을 수행해야마다 하나의 속성에 넣어 싶어. 나는 기본 검증이 어떻게 수행되어야하는지에 대한 규칙을 정의 할 수있는 솔루션을 찾고있다.

미리 감사드립니다.

+0

내가 여러 가지 이유로 그렇게하고 싶지 않아 널 (NULL) 날짜로 날짜와 나이를 확인하고 각각 – LostInComputer

+0

을 int로. 데이터 유형은 널 (NULL) 입력이 가능해야합니다. – Buduls

답변

1

int에 대한 ModelBinder를 직접 만드십시오. 그런 다음 바인더가 오류가 발생하면 0을 반환합니다.

public class IntModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object actualValue = null; 
     try 
     { 
      actualValue = Convert.ToInt32(valueResult.AttemptedValue, 
       System.Globalization.CultureInfo.InvariantCulture); 
     } 
     catch (FormatException e) 
     { 
      //Uncomment for default error 
      //modelState.Errors.Add(e); 
      actualValue = 0; 
     } 

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return actualValue; 
    } 
} 

그리고 전 세계.asax Application_Start() :

ModelBinders.Binders.Add(typeof(int), new IntModelBinder()); 
+0

좋은 답변입니다! 꽤 잘 작동하는 것 같습니다. – Buduls