自己開發的公眾號,可以領取淘寶內部優惠券
客戶端驗證
上文只說了客戶端的自定義驗證,這樣對於用戶的輸入還是不夠可靠,用戶完全可以繞過我們定義的客戶端驗證。所以僅有客戶端的驗證還是不夠的,我們還需要在服務器端進行再次驗證。
ValidationAttribute
服務端驗證要繼承自ValidationAttribute,並重寫IsValid虛方法來自定義自己的驗證規則,ValidationAttribute聲明大致如下
public abstract class ValidationAttribute : Attribute { //驗證失敗提示消息 public virtual string FormatErrorMessage(string name); //自定義驗證一 protected virtual ValidationResult IsValid(object value, ValidationContext validationContext); //自定義驗證二 public virtual bool IsValid(object value); }
UrlAttribute
UrlAttribute 是用來驗證Url格式的有效性,這個特性在NET Framework 4.5已經自帶實現。我們就參考着做個例子。
public class Link { [Required] [DisplayName("文字")] public string Text { get; set; } [Url] [Required] [DisplayName("Url鏈接")] public string Url { get; set; } } public class UrlAttribute : ValidationAttribute,IClientValidatable { public override string FormatErrorMessage(string name) { return string.Format("{0}格式有誤", name); } public UrlAttribute() { } public override bool IsValid(object value) { var text = value as string; Uri uri; return (!string.IsNullOrWhiteSpace(text) && Uri.TryCreate(text, UriKind.Absolute, out uri)); } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var validationRule = new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.DisplayName), ValidationType = "url", }; yield return validationRule; } }
UrlAttribute實現服務端和客戶端的驗證,客戶端我們只是為input控件添加data-val-url屬性,但他的客戶端驗證還是有效的,因為validate這個插件已經實現它的js驗證腳本。
我們將ValidationType名字改下取消客戶端驗證,提交到服務端進行驗證