zoukankan      html  css  js  c++  java
  • ASP.NET MVC ValidationAttribute 服务器端自定义验证

    自定义服务端验证要继承自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 ModelClientValidationRule
    23             {
    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;
                }
            }
        }
  • 相关阅读:
    CompletableFuture(yet)
    模拟future
    一次使用jmap评估是否可以把类似session信息挂靠在某未知框架的某暴露对象上
    只读事务与普通读
    多重分表分库一般解决方案
    mat解决oom一般方法实践
    类加载器隔离朴实案例(二)logback
    在51系列中data,idata,xdata,pdata的区别
    linux 简单的DMA例程
    disable_irq()与disable_irq_nosync()区别
  • 原文地址:https://www.cnblogs.com/cuijl/p/7423241.html
Copyright © 2011-2022 走看看