吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1963|回复: 6
收起左侧

[其他转载] C#中 自定义验证规则ValidationAttribute的使用

[复制链接]
迷恋自留地 发表于 2021-9-4 16:38

C#中 自定义验证规则ValidationAttribute的使用

进行接口请求的时候难免会对请求字段进行验证,验证对象的所有字段的值是否合乎要求,如进行非空检测,长度检测等等。

Required

用法示例

[Required(ErrorMessage="请填写名称")]

如果属性为null,"",或只包含空白字符,会引发异常(ModelState.IsValid会false)

RegularExpression

用法示例

[RegularExpression(pattern:@"^[1-9]\d*$",ErrorMessage ="请选择部门")]

上面的示例是正整数检测,其他常用正则表达式自行搜索

Compare

用来检测两个字段是否相等

示例

[Compare("NewPassword",ErrorMessage ="确认密码和新密码不一致,请检查")]

MaxLength

示例

[MaxLength(length:11,ErrorMessage ="请填写合法的手机号")]

当然手机号不可能是上面那种检测,这里只是示例

这个注解最常用在字符串上,不过神奇的是也可以用在数组上面,非常有趣

MinLength

和上面MaxLength一样

用来检测数组非空挺好用的,但是注意是无法用到List类型的属性上面的

Range

range除了能用来限定数字的使用范围以外,还可以用来限定其他类型!(当然一般正则表达式可能用的更多)

示例

Range[0,100,ErrorMessage="请输入0到100的数字"]

因为构造函数包含3种

RangeAttribute(int32,int32)

RangeAttribute(double,double)

RangeAttribute(Type,string,string)

StringLength
有了MaxLength和MinLength不知道还要StringLengthAttribute干嘛,请大佬解释

CustomValidation

主要是用来执行自定义的验证

构造方法的参数如下

Type validatorType :自定义验证方法的类

string method:自定义验证的方法名称

这个类让我们自定义格式检验注解变得简单

先定义检测方法

public class TestValidator
    {
        public static ValidationResult TestAge(int age)
        {
            if (age > 10 && age < 20)
            {
                return new ValidationResult("10<age<20,你太年轻了");
            }
            else
            {
                return ValidationResult.Success;
            }
        }
    }

然后应用注解

[CustomValidation(typeof(TestValidator),"TestAge")]
public int Age { get; set; }

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zjy-geek 发表于 2021-9-30 09:18
你需要定义一个抽象类,然后再去继承实现各种类型的检验
[C#] 纯文本查看 复制代码
/// <summary>
    /// 验证抽象类
    /// </summary>
    public abstract class VerifyBase : Attribute
    {
        /// <summary>
        /// 错误
        /// </summary>
        public abstract string Error { get; set; }

        /// <summary>
        /// 验证方法
        /// </summary>
        /// <param name="value">值</param>
        /// <returns></returns>
        public abstract bool Verify(object value);

    }


[C#] 纯文本查看 复制代码
/// <summary>
    /// 不为空属性
    /// </summary>
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public class NotNullAttribute : VerifyBase
    {

        /// <summary>
        /// 错误
        /// </summary>
        public override string Error { get; set; }

        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="error">错误</param>
        public NotNullAttribute(string error = "")
        {
            Error = string.IsNullOrWhiteSpace(error) ? "不允许为Null" : error;
        }

        /// <summary>
        /// 验证
        /// </summary>
        /// <param name="value">值</param>
        /// <returns></returns>
        public override bool Verify(object value)
        {
            return value != null;
        }
    }


[C#] 纯文本查看 复制代码
/// <summary>
        /// 验证
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="obj">对象</param>
        /// <param name="declaredOnly">仅声明成员,不考虑继承成员.</param>
        /// <returns></returns>
        public static T Verify<T>(this T obj, bool declaredOnly = true) where T : class, new()
        {
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj));
            }
            var type = typeof(T);
            if (!type.IsGenericType)
            {
                var prop = type.GetProperties(declaredOnly ? BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly : BindingFlags.Public | BindingFlags.Instance);
                foreach (var p in prop)
                {
                    var attributes = p.GetCustomAttributes<VerifyBase>();
                    foreach (var attribute in attributes)
                    {
                        var value = p.GetValue(obj);
                        if (!attribute.Verify(value))
                        {
                            throw new ArgumentException($"{p.Name} {attribute.Error}");
                        }
                    }
                }
            }
            return obj;
        }
shc1221 发表于 2021-9-4 17:29
hellozl 发表于 2021-9-4 18:39
[C#] 纯文本查看 复制代码
        [Display(Name ="标题")]
        [StringLength(50, ErrorMessage = "{0}的长度应在{2}-{1}之间", MinimumLength = 3)]
        [Required]
        public string Title { get; set; }
CrazyNut 发表于 2021-9-4 19:34
ASP感觉没啥人用啊
 楼主| 迷恋自留地 发表于 2021-9-4 20:25
CrazyNut 发表于 2021-9-4 19:34
ASP感觉没啥人用啊

web api可以用这些验证
homelessd 发表于 2021-9-30 14:02
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表