1` 方法一:使用模型注解方式
缺点:只能用在属性上,会造成代码入侵,增加代码耦合,且只能在Controller中的Action中使用
优点:简单方便
①`创建实体类加上模型注解
//模型类
public class User
{
[MaxLength(10,ErrorMessage ="名字太长了")]
public string userName { get; set; }
[RegularExpression(@"^1[3456789]\d{9}$",ErrorMessage ="请输入正确的手机号")]
public string userMobile { get; set; }
}
//接口
public class ValidationTestController : ControllerBase
{
[HttpPost("Add")]
public string AddUser(User user)
{
return "添加成功";
}
}
②`在请求Api时会自动校验
2` 方法二:自定义属性Attribute验证
缺点:只能在Controller中的Action中使用
优点:可以声明到类级别上,并且可以在方式一上继续封装,能实现复杂的验证
①`定义一个类:UserFilterValidationAttribute,继承ValidationAttribute类,重写IsVaild()
public class UserFilterValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object? value, ValidationContext validationContext)
{
//获取类的示例对象
var user = (User)validationContext.ObjectInstance;
if (String.IsNullOrWhiteSpace(user.userName))
return new ValidationResult("用户名不能为空", new[] { nameof(user.userName) });
if (user.userName.Length > 10)
return new ValidationResult("用户名太长", new[] { nameof(user.userName) });
if (!String.IsNullOrWhiteSpace(user.userMobile))
{
var regex = new Regex(@"^1[3456789]\d{9}$");
if ((!regex.IsMatch(user.userMobile)))
return new ValidationResult("用户手机号格式不正确", new[] { nameof(user.userMobile) });
}
else
{
return new ValidationResult("用户手机号为空", new[] { nameof(user.userMobile) });
}
return ValidationResult.Success;
}
}
②`将UserFilterValidationAtttibute声名到类上
[UserFilterValidation]//直接声明到类上
public class User
{
public string userName { get; set; }
public string userMobile { get; set; }
}
③`请求Api的时候就会自动验证
3` 方法三:使用FluentValidation进行验证
优点:可以在任何场景使用,不会造成代码耦合,适合大项目使用(小项目前两种足 够)
①`引入Nuget包:FluentValidation.AspNetCore
②`新建UserFilterValidation类继承AbstractValidator<模型类>,代码如下
public class UserFilterValidation : AbstractValidator<User>
{
public UserFilterValidation()
{
//设置为Stop,则在出现验证不符合就会立刻终止,不会往下执行
//默认值为Continue
CascadeMode = CascadeMode.Stop;
RuleFor(x => x.userName).NotEmpty().WithMessage("用户名不能为空")
.Length(2, 10).WithMessage("用户名最少2个字符,最多10个字符");
RuleFor(x => x.userMobile).NotEmpty().WithMessage("手机号必填")
.Length(11).WithMessage("手机号为11位")
.Must(IsMobile).WithMessage("手机号格式不对");
}
//手机验证
private bool IsMobile(string Mobile)
{
return Regex.IsMatch(Mobile, @"^1[3456789]\d{9}$");
}
}
③`使用UserFilterValidation
[HttpPost("Add")]
public ApiResult AddUser(User user)
{
//实例一个接口返回对象(自己定义)
ApiResult result = new ApiResult();
//实例一个UserFilterValidation对象,当然可以使用IOC注入,就不演示了
UserFilterValidation rules = new UserFilterValidation();
//UserFilterValidation的结果
ValidationResult validationResult = rules.Validate(user);
if (validationResult.IsValid)
{
//校验通过
result.code = 200;
result.msg = "添加成功";
result.success = true;
result.data = user;
}
else
{
result.code = 500;
result.msg = validationResult.ToString(",");
}
return result;
}