2012-05-01 5 views
1

ASP.NET MVC 3 App에서 전화 번호에 대한 사용자 정의 유효성 검사기를 구현하려고합니다.ASP.NET MVC 3 - 사용자 정의 검사기

[Display(Name = "PhoneNumber")] 
    [Required(ErrorMessage = "Is Phone Number Required")] 
    [PhoneNumberValidator] 
    public string PhoneNumber { get; set; } 

을 내 응용 프로그램을 실행하고 클릭하면 그러나 페이지이 버튼을 계속 : 나는 다음과 같은 한 내 모델 클래스의 다음

public class PhoneNumberValidator : ValidationAttribute 
{ 


    public PhoneNumberValidator() : base("The Phone Number is not Valid") 
    { 
    } 
    public override bool IsValid(object value) 
    { 
     if (value != null) 
     { 
      string phonenumber = value.ToString(); 

      var regex = new Regex(@"^(?:[0-9]+(?:-[0-9])?)*$"); 

      if (regex.IsMatch(phonenumber)) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     return false; 
    } 
} 

아래와 같은 사용자 정의 유효성 검사기에 대한 코드를 wriiten 한 내가 입력 된 값이 글자 인 경우 오류를 던지지 않습니다. 중단 점을 설정하면 값이 phonenumber 문자열에 읽혀지고 있음을 볼 수 있습니다. 나는 간단한 것을 놓치고 있습니까?

+0

참조 http://stackoverflow.com/questions/2689444/custom-dataannotations-을 omewhere 당신이 당신의보기에서 해당 자리가 있는지 확인 validator-derived-regularexpressionattribute –

답변

3

바퀴를 다시 만들고있는 것 같습니다. 기존의 정규식 유효성 검사기를 사용하지 이유 :

[HttpPost] 
public ActionResult Process(MyViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // the model is invalid => redisplay view 
     return View(model); 
    } 

    // at this stage the model is valid => you could do some processing here 
    // and redirect 
    ... 
} 
:

public class MyViewModel 
{ 
    [Display(Name = "PhoneNumber")] 
    [Required(ErrorMessage = "Is Phone Number Required")] 
    [RegularExpression(@"^(?:[0-9]+(?:-[0-9])?)*$")] 
    public string PhoneNumber { get; set; } 
} 

이 존재 검증 모델 바인더에 의해 트리거 때문에 컨트롤러 액션 당신의 양식을 인수로보기 모델을 걸립니다 제출되어 있는지 확인 상기

또는 TryUpdateModel 방법 (개인적으로는 이전의 접근 방식은 비록 선호)를 사용 : 오류 메시지의를 표시하기 위해 또한

[HttpPost] 
public ActionResult Process(FormCollection some_Dummy_Parameter_Thats_Not_Used_At_All_But_Which_We_Need_To_Avoid_The_Method_Overloading_Error_With_The_GET_Action_Which_Has_The_Same_Name) 
{ 
    var model = new MyViewModel(); 
    if (!TryUpdateModel(model)) 
    { 
     // the model is invalid => redisplay view 
     return View(model); 
    } 

    // at this stage the model is valid => you could do some processing here 
    // and redirect 
    ... 
} 

@Html.EditorFor(x => x.PhoneNumber) 
@Html.ValidationMessageFor(x => x.PhoneNumber) 

또는 검증 요약 도우미 사용 :

@Html.ValidationSummary(false) 
+0

당신이 언급 한 것처럼 regex를 사용할 수 있다는 것을 알고 있습니다. 그러나 더 나은 디자인을 위해 수많은 페이지에서 여러 위치에 사용될 것입니다. 그래서 모든 사용자 정의 유효성 검사 클래스가 포함될 유효성 검사 폴더가 필요합니다. 그래서 전화 번호, 우편 번호/날짜 등의 것들 - 응답 해 주셔서 감사합니다 - 나는 그것에 대해 조사 할 것입니다. –

+0

수정하십시오. 이 경우 사용자 정의 유효성 검사기를 갖는 것이 적절합니다. –

+0

많은 감사합니다 - 저는 그것이 누락 된 페이지의 자리 표시 자라고 생각합니다. –

관련 문제