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) 你需要定义一个抽象类,然后再去继承实现各种类型的检验
/// <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;
} 感谢分享{:1_921:}
public string Title { get; set; }
ASP感觉没啥人用啊 CrazyNut 发表于 2021-9-4 19:34
ASP感觉没啥人用啊
web api可以用这些验证 感谢楼主分享
页:
[1]