迷恋自留地 发表于 2021-9-4 16:38

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

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

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

### Required
用法示例

>``

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

### RegularExpression

用法示例

>`\d*$",ErrorMessage ="请选择部门")]`

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

### Compare

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

示例

>``
>
### MaxLength
示例

>``

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

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

### MinLength
和上面MaxLength一样

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

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

示例

>`Range`

因为构造函数包含3种

RangeAttribute(int32,int32)

RangeAttribute(double,double)

RangeAttribute(Type,string,string)

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

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

构造方法的参数如下

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

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

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

先定义检测方法

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

然后应用注解

```csharp

public int Age { get; set; }
```

![](https://img-blog.csdnimg.cn/d47f115e871f462f80998424b1219fdf.jpg)

zjy-geek 发表于 2021-9-30 09:18

你需要定义一个抽象类,然后再去继承实现各种类型的检验
/// <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);

    }

/// <summary>
    /// 不为空属性
    /// </summary>
   
    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;
      }
    }

/// <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

感谢分享{:1_921:}

hellozl 发表于 2021-9-4 18:39


      
      
      
      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

感谢楼主分享
页: [1]
查看完整版本: C#中 自定义验证规则ValidationAttribute的使用