首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >blazor是自定义异步验证

blazor是自定义异步验证
EN

Stack Overflow用户
提问于 2022-06-29 13:38:00
回答 1查看 123关注 0票数 1

我正在开发一个blazor应用程序,我很难理解如何在一个字段上执行自定义异步验证。我正在使用devexpress的blazor调度程序,并试图验证一个自定义编辑表单,该表单支持通过数据注释进行验证。但是,我必须基于异步地从自定义api中检索的值来验证字段。我试图创建一个自定义验证器,但我很快意识到,由于以下原因,我无法在验证上下文中注入任何注册服务:https://github.com/dotnet/aspnetcore/issues/11397,因此我尝试使用一个fluent验证器包,并创建了这个验证器:

代码语言:javascript
复制
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然后给出和异常:

不能在此运行时验证上等待监视器。

所以我不知道,我真的没有选择了,对于我来说,为了这么简单的事情而不得不经历所有这些问题似乎很奇怪。也许我只是错过了一些显而易见的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-29 15:17:56

您需要编写自己的验证系统。

在标准EditForm中,验证是通过调用EditContext上的Validate()来驱动的。

相关代码(来自EditContext.cs)是:

代码语言:javascript
复制
public event EventHandler<ValidationRequestedEventArgs>? OnValidationRequested;

public bool Validate()
    {
        OnValidationRequested?.Invoke(this, ValidationRequestedEventArgs.Empty);
        return !GetValidationMessages().Any();
    }

任何注册的"Validator“都已经用OnValidationRequested注册了一个事件处理程序。

Validate运行时,它调用所有已注册的事件处理程序,然后检查ValidationMessageStore中是否有任何已注册的验证消息。如果有消息,则某些验证失败。

没有异步行为编码到这个-事件是火和忘记。

异步事件处理程序如下所示:

代码语言:javascript
复制
private async void OnValidationRequestedAsync(object? sender, ValidationRequestedEventArgs e)
{
   // emulate async behaviour
   await Task.Delay(2000);
}

它的返回值是空的。一旦产生结果,Validate就会继续,在商店中看不到任何验证消息并完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72802385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档