標籤:model js驗證 伺服器端 判斷 class 實體類 nbsp 業務 white
自訂服務端驗證要繼承自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 ModelClientValidationRule23 {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 伺服器端自訂驗證