1. 程式人生 > >ASP.NET MVC ValidationAttribute 服務器端自定義驗證

ASP.NET MVC ValidationAttribute 服務器端自定義驗證

ttr ror 服務端 繼承 image hide form rri es2017

自定義服務端驗證要繼承自ValidationAttribute,並重寫IsValid虛方法來自定義自己的驗證規則,ValidationAttribute源碼如下:

 1 public abstract class ValidationAttribute : Attribute
 2     {
 3        //驗證失敗提示消息
 4        public virtual string FormatErrorMessage(string name);
 5         
 6        //自定義驗證一
 7        protected virtual ValidationResult IsValid(object
value, ValidationContext validationContext); 8 9 //自定義驗證二 10 public virtual bool IsValid(object value); 11 }

參考系統實例:

技術分享
public class Link
    {
        [Required]
        [DisplayName("文字")]
        public string Text { get; set; }
        [Url]
        [Required]
        [DisplayName(
"Url鏈接")] public string Url { get; set; } }
實體類
 1 public class UrlAttribute : ValidationAttribute,IClientValidatable
 2     {
 3         public override string FormatErrorMessage(string name)
 4         {
 5             return string.Format("{0}格式有誤", name);
 6         }
 7  
 8         public
UrlAttribute() 9 { 10 } 11 12 public override bool IsValid(object value) 13 { 14 var text = value as string; 15 Uri uri; 16 17 return (!string.IsNullOrWhiteSpace(text) && Uri.TryCreate(text, UriKind.Absolute, out uri)); 18 } 19 20 public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 21 { 22 var validationRule = new ModelClientValidationRule 23 { 24 ErrorMessage = FormatErrorMessage(metadata.DisplayName), 25 ValidationType = "url", 26 }; 27 28 yield return validationRule; 29 } 30 }

UrlAttribute實現服務端和客戶端的驗證,客戶端我們只是為input控件添加data-val-url屬性,但他的客戶端驗證還是有效的,因為validate這個插件已經實現它的js驗證腳本。

技術分享

IValidatableObject接口實現Model數據驗證

如果在自定義的業務邏輯中,獲取到當前類的其他字典。。。
因為驗證邏輯需要根據當前model的多個字段來綜合判斷。

實現起來很簡單,需要model繼承IValidatableObject接口

public class Student : IValidatableObject
    {
        public int ID { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (Age % 2 == 0)
            {
                var result = new ValidationResult("年齡的驗證有問題",new string[]{"Age"});

                yield return result;
            }
        }
    }

ASP.NET MVC ValidationAttribute 服務器端自定義驗證