流利验证未根据要求进行验证

时间:2018-11-22 23:59:20

标签: c# asp.net-core fluentvalidation

我正在尝试为.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被点击时,它在管道中不起作用?

2 个答案:

答案 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,启动的来源。