2012-05-01 24 views
1

私はASP.NET MVC 3 Appで電話番号のカスタムバリデータを実装しようとしています。私はその後、私のモデルクラスで、私は次のようしているASP.NET MVC 3 - カスタムバリデータ

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ています

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

をしかし、私はそれを私のアプリを実行し、ページに進む]ボタンをクリックしたとき私はブレークポイントを設定した場合、値が文字列phonenumberに読み込まれていることがわかりますが、入力された値が文字の場合はエラーをスローしません。私は何か簡単なものを逃しています

+0

はhttp://stackoverflow.com/questions/2689444/custom-dataannotations-を参照してください。バリデータから得たregularexpression属性 –

答えて

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方法(個人的に私も以前のアプローチを好む)を使用:エラーメッセージSを表示するために、また

[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 
    ... 
} 

をomewhereあなたのビューに対応するプレースホルダを持っていることを確認してください。

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

または検証の概要ヘルパーを使用します。

@Html.ValidationSummary(false) 
+0

あなたが言及したように私は正規表現を使うことができると知っています - それは多くのページの複数の場所で使用されるでしょう。しかし、より良いデザインのためにはすべてのカスタムバリデーションクラス、電話番号、郵便番号/郵便番号などのためのもの - あなたに感謝してくれてありがとう - 私はそれを調べます。 –

+0

正しい。この場合、カスタムバリデータを持つことは適切なようです。 –

+0

多くのありがとう - 私はそれが私が行方不明だったページのプレースホルダだったと思います –