自己開發的公眾號,可以領取淘寶內部優惠券

客戶端驗證
上文只說了客戶端的自定義驗證,這樣對於用戶的輸入還是不夠可靠,用戶完全可以繞過我們定義的客戶端驗證。所以僅有客戶端的驗證還是不夠的,我們還需要在服務器端進行再次驗證。
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名字改下取消客戶端驗證,提交到服務端進行驗證


