我正在开发一个blazor应用程序,我很难理解如何在一个字段上执行自定义异步验证。我正在使用devexpress的blazor调度程序,并试图验证一个自定义编辑表单,该表单支持通过数据注释进行验证。但是,我必须基于异步地从自定义api中检索的值来验证字段。我试图创建一个自定义验证器,但我很快意识到,由于以下原因,我无法在验证上下文中注入任何注册服务:https://github.com/dotnet/aspnetcore/issues/11397,因此我尝试使用一个fluent验证器包,并创建了这个验证器:
public class TlSchedulerAppointmentFormInfoValidator : AbstractValidator<TlSchedulerAppointmentFormInfo>
{
private readonly HttpClient _client;
public TlSchedulerAppointmentFormInfoValidator(HttpClient client)
{
_client = client;
RuleFor(p => p.EndUser)
.MustAsync(async (endUser, cancellation) => await IsEndUserRequired(endUser))
.WithMessage("You must enter your age");
}
private async Task<bool> IsEndUserRequired(string endUser)
{
var setup = await _client.GetFromJsonAsync<Setup>("Setup/Requirements");
bool req = setup?.EndUserObbligatorio ?? false;
return !req || !string.IsNullOrEmpty(endUser);
}
}但这也不起作用,因为验证器是异步的,并且表单在验证发生之前关闭,因此我猜这是从fluent验证器文档中获取的:
当使用带有ASP.NET的自动验证时,不应使用异步规则,因为ASP.NET的验证管道不是异步的。如果在ASP.NET的自动验证中使用异步规则,则它们将始终同步运行(10.x及更高版本)或抛出异常(11.x和更新版本)。
好的,我试着(我知道我不应该这么做) GetAwaiter().GetResult() http调用,但是blazor然后给出和异常:
不能在此运行时验证上等待监视器。
所以我不知道,我真的没有选择了,对于我来说,为了这么简单的事情而不得不经历所有这些问题似乎很奇怪。也许我只是错过了一些显而易见的东西。
发布于 2022-06-29 15:17:56
您需要编写自己的验证系统。
在标准EditForm中,验证是通过调用EditContext上的Validate()来驱动的。
相关代码(来自EditContext.cs)是:
public event EventHandler<ValidationRequestedEventArgs>? OnValidationRequested;
public bool Validate()
{
OnValidationRequested?.Invoke(this, ValidationRequestedEventArgs.Empty);
return !GetValidationMessages().Any();
}任何注册的"Validator“都已经用OnValidationRequested注册了一个事件处理程序。
当Validate运行时,它调用所有已注册的事件处理程序,然后检查ValidationMessageStore中是否有任何已注册的验证消息。如果有消息,则某些验证失败。
没有异步行为编码到这个-事件是火和忘记。
异步事件处理程序如下所示:
private async void OnValidationRequestedAsync(object? sender, ValidationRequestedEventArgs e)
{
// emulate async behaviour
await Task.Delay(2000);
}它的返回值是空的。一旦产生结果,Validate就会继续,在商店中看不到任何验证消息并完成。
https://stackoverflow.com/questions/72802385
复制相似问题