ASP.NET MVC ValidationAttribute 服务器端自定义验证

客户端验证

上文只说了客户端的自定义验证,这样对于用户的输入还是不够可靠,用户完全可以绕过我们定义的客户端验证。所以仅有客户端的验证还是不够的,我们还需要在服务器端进行再次验证。

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名字改下取消客户端验证,提交到服务端进行验证

 

代码下载

ASP.NET MVC ValidationAttribute 服务器端自定义验证,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。