gpt4 book ai didi

asp.net-core - 如何使用 .NET Core 在 Web API 中使用 FluentValidation 执行异步 ModelState 验证

转载 作者:行者123 更新时间:2023-12-02 03:20:15 25 4
gpt4 key购买 nike

这个问题是这篇文章的跟进 - How to perform async ModelState validation with FluentValidation in Web API? .

我想知道 FluentValidation 是否有办法在 .net 核心 web api 中执行异步 ModelState 验证。我有一个 FluentValidation 验证器类,其中包含异步验证方法,例如“MustAsync”,这意味着在我的业务服务类中,我使用“ValidateAsync”手动调用验证器。我还想使用相同的验证器类来验证来自请求的模型。我仔细阅读了文档,了解到执行此操作的唯一方法是手动调用“ValidateAsync()”方法,因为 .net 管道是同步的。我宁愿不必从我的 Controller 中手动调用此方法,我宁愿在启动时注册它(让框架自动调用我的模型上的验证器)或用验证器装饰我的请求模型。

有没有人能做到这一点?

谢谢!

最佳答案

根据链接的问题,我稍微调整了代码以与 ASP.NET Core(2.2,在我的例子中)兼容。通常,这是使用 IAsyncActionFilter 接口(interface)。你可以阅读它in the official docs .

public class ModelValidationActionFilter : IAsyncActionFilter
{
private readonly IValidatorFactory _validatorFactory;
public ModelValidationActionFilter(IValidatorFactory validatorFactory) => _validatorFactory = validatorFactory;

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var allErrors = new Dictionary<string, object>();

// Short-circuit if there's nothing to validate
if (context.ActionArguments.Count == 0)
{
await next();
return;
}

foreach (var (key, value) in context.ActionArguments)
{
// skip null values
if (value == null)
continue;

var validator = _validatorFactory.GetValidator(value.GetType());

// skip objects with no validators
if (validator == null)
continue;

// validate
var result = await validator.ValidateAsync(value);

// if it's valid, continue
if (result.IsValid) continue;

// if there are errors, copy to the response dictonary
var dict = new Dictionary<string, string>();

foreach (var e in result.Errors)
dict[e.PropertyName] = e.ErrorMessage;

allErrors.Add(key, dict);
}

if (allErrors.Any())
{
// Do anything you want here, if the validation failed.
// For example, you can set context.Result to a new BadRequestResult()
// or implement the Post-Request-Get pattern.
}
else
await next();
}
}

如果您想全局应用此过滤器,您可以将过滤器添加到 Startup 类中的 AddMvc 调用中。例如:

 services.AddMvc(options => 
{
options.Filters.Add<ModelValidationActionFilter>();

// uncomment the following line, if you want to disable the regular validation
// options.ModelValidatorProviders.Clear();
});

关于asp.net-core - 如何使用 .NET Core 在 Web API 中使用 FluentValidation 执行异步 ModelState 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55048016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com