You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server中EditContext自定义验证消息的添加与清除问题

Blazor Server中自定义EditContext验证消息的添加与清除问题

我正在将一个仅作为UI层的Razor Pages应用迁移到Blazor Server渲染模式,所有数据访问和操作都通过外部API完成。在CRUD操作时,API会以标准化格式返回错误对象集合——之前在Razor Pages里,我已经实现了将这些错误集合转换为ModelStateDictionary条目的逻辑,运行效果完全符合预期:错误消息能正常显示,用户修改内容后可以重新提交表单。

但到了Blazor应用里,我编写了类似的代码把API返回的错误添加到EditContext中,却始终找不到清除这些自定义添加的验证消息的正确方法。我查阅了相关问题并尝试了所有建议方案,但都没有效果。

自定义错误添加逻辑

下面是我用来向EditContext添加错误消息的方法:

private static void AddErrors(EditContext editContext, Dictionary<string, List<string>> errorDictionary) {
    if (errorDictionary != null && errorDictionary.Any()) {
        var validationMessageStore = new ValidationMessageStore(editContext);
        foreach (var error in errorDictionary) {
            validationMessageStore.Add(editContext.Field(error.Key), error.Value);
        }
        editContext.NotifyValidationStateChanged();
    }
}

表单组件代码

我的EditForm定义如下:

<EditForm class="form-signin" OnValidSubmit="OnSubmit" Model="loginModel" Context="CurrentEditContext">
    <DataAnnotationsValidator />
    <SummaryOnlyValidationSummary />
    <div class="form-group">
        <InputText id="inputUsername" class="form-control" @bind-Value="loginModel.Username" autofocus placeholder="Username" @onkeyup="@(q => ResetValidation(CurrentEditContext))" />
        <ValidationMessage For="@(() => loginModel.Username)" />
    </div>
    <div class="form-group">
        <InputText type="password" id="inputPassword" class="form-control" placeholder="Password" @bind-Value="loginModel.Password" />
        <ValidationMessage For="@(() => loginModel.Password)" />
    </div>
    <div class="form-group">
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </div>
</EditForm>

补充说明

  • 表单提交方法签名:protected async Task OnSubmit(EditContext editContext),传入的editContext中,由DataAnnotationsValidator生成的验证消息(比如模型属性的Required特性提示)是准确无误的。
  • SummaryOnlyValidationSummary是我自定义的组件,功能和原生ValidationSummary类似,但会排除已经由DataAnnotationsValidator单独显示的消息。

核心疑问

  1. 我当前添加自定义验证消息的方式是否存在错误?如果有,应该如何修正?
  2. 如果添加方式是正确的,那该如何正确清除或重置这些自定义添加的验证消息?我已经尝试过强制提交表单、调用editContext.Validate(),但都无法清除这些自定义消息。另外,在ResetValidation方法中创建当前editContext的新ValidationMessageStore实例时,这个实例里不包含任何消息,我不确定这是否是预期行为。

内容的提问来源于stack exchange,提问作者Will Parsons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:42:28