我正在尝试为.net核心设置流利的验证。
我一直在遵循的指南告诉我: *添加aspnetcore流利的验证包 *在自定义验证器中制定规则 *在启动时注册。
我正在尝试使其工作,并且仅当在我的代码中实例化验证器的实例然后进行验证时,它才起作用。我想在它到达之前就对它进行验证!
这为什么不起作用?
到目前为止,我的代码:
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]GraphQlQuery query)
{
try
{
using (PerformanceTimer.StartNew("Performing GraphQL query", str=> LogHelper.Info(str)))
{
if (!ModelState.IsValid)
{
return null;
}
Startup.cs
services.AddMvc(opt => opt.Filters.Add(typeof(ValidatorActionFilter)))
.AddFluentValidation(x => x.RegisterValidatorsFromAssemblyContaining<AccountValidator>())
验证者:
public class AccountValidator : AbstractValidator<Account>
{
public AccountValidator()
{
RuleFor(c => c.CreditLimit)
.LessThan(0).WithMessage("Credit Limit can not be less than 0")
.GreaterThan(100).WithMessage("Credit Limit can not be greater than 100");
}
}
尽管如此,它仍然有效:
var accountValidator = new AccountValidator();
x.Add(accountValidator.Validate(new Account { CreditLimit = 999}));
我已经更新了对象,因此应该被击中。我将CreditLimit添加为101。
为什么当我的api被点击时,它在管道中不起作用?
答案 0 :(得分:0)
FluentValidation用于验证端点的输入参数。在您的情况下,如果您要从正文验证帐户,这应该可以工作。如果要验证查询,则必须编写QueryValidator。
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]Account account)
{
try
{
using (PerformanceTimer.StartNew("Performing GraphQL query", str=> LogHelper.Info(str)))
{
if (!ModelState.IsValid)
{
return null;
}
答案 1 :(得分:0)
我建议您的第一个更改是将 .AddFluentValidation 更改为
.AddFluentValidation(x => {x.RegisterValidatorsFromAssemblyContaining<Startup>();});
这会导致自动加载程序集中包含的所有验证器。
导致我遇到同样问题的第二件事是验证器未包含在相同的项目中。我在 Core 项目中有 Validator 类,而不是 Api,启动的来源。