繁体   English   中英

如何实现异步 ValidationAttribute.IsValid()

[英]How can I implement an async ValidationAttribute.IsValid()

我有一个用例,当用户在表单中输入 email 时,我需要验证它是唯一的。 这是为了注册为新用户,我们应用程序中的每个用户 email 都必须是唯一的。

执行此操作的调用需要时间,因为它正在访问数据库。 因此我希望它是异步的。 以下工作也是如此,我如何完成以下有问题的步骤。

如果我使用CustomValidation而不是 ValidationAttribute 会怎样? 这对于同步复杂验证非常有效。 但是让它异步......

<EditForm EditContext="_editContext" OnValidSubmit="HandleValidSubmitAsync" OnInvalidSubmit="HandleInvalidSubmitAsync" Context="EditFormContext">
    <DataAnnotationsValidator />
    <CustomValidation @ref="_customValidation" />

当调用它进行验证时,它会启动后台任务并返回错误“正在检查 email...”

现在我不知道该怎么做。 任务完成时:

  1. 我如何更新 CustomValidation object,要么说 email 有效,要么将消息更新为现在说 email 是重复的?
  2. 如果我可以简单地更新 _customValidation.ClearErrors()/DisplayErrors(),我可以在任务完成的线程中调用它吗? 或者我是否需要执行类似于 WinForms 的操作,在其中调用将在主/UI 线程中调用的方法?
  3. 然后我如何告诉表单 CustomValidation object 已经更改,现在可能允许提交?

如果任务完成后我所能做的就是更新 object,然后强制表单重新验证 email,我可以完成这项工作。 但在那种情况下,我仍然有上面的#3,我该如何实现呢?

您可以像这样实现自定义验证:


EditContext editContext;
ValidationMessageStore messageStore;

protected override void OnInitialized()
{
    editContext = new(yourModel);
    messageStore = new(editContext);

    editContext.OnValidationRequested += Validate;
}

void Validate(object sender, ValidationRequestedEventArgs args)
{
    messageStore.Clear();

    if (yourModel.RequiredObject == null)
        messageStore.Add(() => yourModel.RequiredObject, "This object is required!");

    editContext.NotifyValidationStateChanged();
}

然后在您用于数据提交的方法中,您可以调用editContext.Validate() ,它会根据验证是否成功返回一个bool ,或者在您的EditForm组件中使用editContext object 。

当然有很多方法,但是您需要放弃EditContext进行验证。

验证过程是同步的。 它基于标准事件。

“提交”表单调用EditContext上的Validate ,如下所示:

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

这会调用OnValidationRequested ,然后检查验证消息。 这是标准的“即发即弃”事件流程。 它不等待任何处理程序,因此总是会在任何让步处理程序完成之前完成,并可能提供错误的结果。

如果您想要异步行为,则需要编写自己的验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM