[MVC]Property頭上來自訂驗證吧

[MVC]Property頭上來自訂驗證吧

在ASP.NET MVC的Proprerty上有提供幾個我們常用的驗證Attribute如:

   1:  [Required]
   2:  public string CurrentName { get; set; }

不過我們大家都知道軟體絕對不會這麼單純,就只會用到這幾個常用的驗證,

隨著客戶難搞的程度,相關的驗證規則的複雜也會成正比攀升,內定的驗證是絕對

hold不住客戶,所以苦命的我們就要很命苦的自己寫驗證,下方的Code就是用來自訂一個驗證Attribute如:

 

要自訂驗證Attribute可選擇繼承RegularExpressionAttribute 或 ValidationAttribute,若是驗證的方式沒有太複雜的話,

可選用RegularExpressionAttribute 比較單純一點,下方的Code是RegularExpressionAttribute class

   1:      [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
   2:      public class RegularExpressionAttribute : ValidationAttribute
   3:      {
   4:          // 取得要用於驗證關聯之成員的規則運算式。pattern:正規表達式!正規表示式!隨便叫
   5:          public RegularExpressionAttribute(string pattern);
   6:   
   7:          public string Pattern { get; }
   8:   
   9:          //根據發生錯誤所在的資料欄位,將格式套用至錯誤訊息。
  10:          public override string FormatErrorMessage(string name);
  11:   
  12:          //判斷指定的物件是否有效。
  13:          public override bool IsValid(object value);
  14:      }

 

在看過它的成員之後就不難寫出一個自己想要的驗證方式如下:

   1:  using System.ComponentModel.DataAnnotations;
   2:  using Globalization;
   3:   
   4:  public class CustomRegularExpressionAttribute : RegularExpressionAttribute
   5:  {
   6:      // pattern正規表達示由外部定義,當然也可以寫死在這邊,讓這個class成為一個專門做某種驗證的Attribute
   7:      public CustomRegularExpressionAttribute(string pattern) : base(pattern)
   8:      {
   9:      }
  10:   
  11:      public override string FormatErrorMessage(string name)
  12:      {
  13:          return "驗證失敗"; 
  14:      }
  15:   
  16:      //判斷指定的物件是否有效。
  17:      public override bool IsValid(object value)
  18:      {
  19:          string valueAsString = value as string;
  20:          return (valueAsString != null);
  21:      }
  22:  }
  23:   
  24:  //這樣的話就便成一個專屬的驗證Email的Attribute
  25:  public class EmailRegularExpressionAttribute : RegularExpressionAttribute
  26:  {
  27:      public EmailRegularExpressionAttribute() : base(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")
  28:      {
  29:      }
  30:   
  31:      public override string FormatErrorMessage(string name)
  32:      {
  33:          return "Email格式不對";
  34:      }
  35:   
  36:      //判斷指定的物件是否有效。
  37:      public override bool IsValid(object value)
  38:      {
  39:          string valueAsString = value as string;
  40:          return (valueAsString != null);
  41:      }
  42:  }

最後就可以在Property上方便使用了

   1:  // patten跟EmailRegularExpression一樣,只是表示patten也可由這邊來決定
   2:  [CustomRegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")]
   3:  public string CustomEmail { get; set; }
   4:   
   5:  [EmailRegularExpression]
   6:  public string Email { get; set; }

以上……………………