网站的开发与建设项目,做网络销售怎么样,做网站需要注意哪些,重庆推广网站排名不用说#xff0c;规则验证很重要#xff0c;无效的参数#xff0c;可能会导致程序的异常。如果使用Web API或MVC页面#xff0c;那么可能习惯了自带的规则验证#xff0c;我们的控制器很干净#xff1a;public class User
{[Required]public string FirstName { get; se… 不用说规则验证很重要无效的参数可能会导致程序的异常。如果使用Web API或MVC页面那么可能习惯了自带的规则验证我们的控制器很干净public class User
{[Required]public string FirstName { get; set; }[Required]public string LastName { get; set; }
}
这种很常见但是今天我想给你一个更好的替代方案FluentValidation 通过这个库您可以流畅地定义用于对象验证的复杂规则从而轻松构建和理解验证规则您可以在 Github[1] 上找到这个项目。安装 FluentValidation我新建了一个很简单的.NET Core 的Web API 程序只有一个接口是用户注册入参是一个User类, 然后在Nuget中安装 FluentValidation。创建第一个验证对于要验证的每个类必须创建其自己的验证器每个验证器类都必须继承AbstractValidatorT其中T是要验证的类,并且所有验证规则都在构造函数中定义。最简单的验证是针对空值如果要指定FirstName和LastName都不能为空这个验证器是这样public class UserValidator : AbstractValidatorUser
{public UserValidator(){RuleFor(x x.FirstName).NotEmpty();RuleFor(x x.LastName).NotEmpty();}
}
就这些了您已经创建了第一个验证器是不是超级简单还有一些其他的规则比如 MinimumLengthMaximumLength和Length用于验证长度您可以把多个规则指定到一个字段就像这样public class UserValidator : AbstractValidatorUser
{public UserValidator(){RuleFor(x x.FirstName).NotEmpty();RuleFor(x x.FirstName).MinimumLength(3);RuleFor(x x.FirstName).MaximumLength(20);RuleFor(x x.LastName).NotEmpty();}
}
验证入参我们之前已经定义了验证规则现在开始使用它您只需要new 一个UserValidator对象然后调用Validate方法, 它会返回一个对象其中包含了验证状态和所有没有通过验证的信息。[HttpPost]
public IActionResult Register(User newUser)
{var validator new UserValidator();var validationResult validator.Validate(newUser);if (!validationResult.IsValid){return BadRequest(validationResult.Errors.First().ErrorMessage);}return Ok();
}
如果我运行程序然后输入一个超长的名字{FirstName: 赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张,LastName: 张
}
我会收到验证错误The length of First Name must be 20 characters or fewer. You entered 24 characters。好吧我不喜欢这个消息那么你可以自定义错误消息这很简单您可以使用 WithMessage 方法。- RuleFor(x x.FirstName).MaximumLength(20);RuleFor(x x.FirstName).MaximumLength(20).WithMessage(您的名字长度已经超出了限制!);
流利验证你可以把验证规则改成下边这样- RuleFor(x x.FirstName).NotEmpty();
- RuleFor(x x.FirstName).MinimumLength(3);RuleFor(x x.FirstName).NotEmpty().MinimumLength(3);
然后也可以把验证规则应用于其他的属性就像这样public UserValidator()
{RuleFor(x x.FirstName).MaximumLength(20).WithMessage(您的名字长度已经超出了限制!).NotEmpty().MinimumLength(3);RuleFor(x x.LastName).NotEmpty();
}
常见的验证规则这个库有很多现成的基本类型验证规则, 对于字符串您可以使用不同的方法比如 EmailAddressIsEnumName检查值是否在指定的Enum类型中定义和 InclusiveBetween, 检查该值是否在定义的范围内。现在我在User类添加了另外两个字段Password 和 ConfirmPassword。Password字段是一个字符串有效的长度必须在5到15个字符之间并且要符合正则为了定义是否满足安全规则我定义了一个HasValidPassword方法它会返回一个bool值。private bool HasValidPassword(string pw)
{var lowercase new Regex([a-z]);var uppercase new Regex([A-Z]);var digit new Regex((\\d));var symbol new Regex((\\W));return (lowercase.IsMatch(pw) uppercase.IsMatch(pw) digit.IsMatch(pw) symbol.IsMatch(pw));
}
然后在密码验证中使用RuleFor(x x.FirstName).MaximumLength(20).WithMessage(您的名字长度已经超出了限制!).NotEmpty().MinimumLength(3);RuleFor(x x.LastName).NotEmpty();RuleFor(x x.Password).Length(5, 15).Must(x HasValidPassword(x));
还可以简化一些RuleFor(x x.Password).Length(5, 15)
- .Must(x HasValidPassword(x));.Must(HasValidPassword);}
ConfirmPassword字段的唯一要求是等于Password字段:RuleFor(x x.ConfirmPassword).Equal(x x.Password).WithMessage(2次密码不一致);
注入验证器修改Startup类中的ConfigureServices方法public void ConfigureServices(IServiceCollection services)
{services.AddControllers().AddFluentValidation();services.AddTransientIValidatorUser, UserValidator();
}
注意这个地方的生命周期是 Transient。这样在调用注册接口的时候会自动进行规则验证[HttpPost]
public IActionResult Register(User newUser)
{return Ok();
}
然后我们再尝试传入参数来调用接口{FirstName: 赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张,LastName: 张
}
很明显验证不通过接口会返回这样的错误信息{type: https://tools.ietf.org/html/rfc7231#p-6.5.1,title: One or more validation errors occurred.,status: 400,traceId: |c4523c02-4899b7f3df86a629.,errors: { FirstName: [您的名字长度已经超出了限制!]}
}希望对您有帮助您可以在官方文档中找到更多的用法。原文链接 https://www.code4it.dev/blog/fluentvalidation[2]最后欢迎扫码关注我们的公众号 【全球技术精选】专注国外优秀博客的翻译和开源项目分享也可以添加QQ群 897216102References[1] Github: https://github.com/FluentValidation/FluentValidation[2] https://www.code4it.dev/blog/fluentvalidation: https://www.code4it.dev/blog/fluentvalidation