MVC ValidationAttribute 服务器端自定义验证 MVC ValidationAttribute 服务器端自定义验证 客户端验证 ValidationAttribute UrlAttribute
客户端验证
上文只说了客户端的自定义验证,这样对于用户的输入还是不够可靠,用户完全可以绕过我们定义的客户端验证。所以仅有客户端的验证还是不够的,我们还需要在服务器端进行再次验证。
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名字改下取消客户端验证,提交到服务端进行验证