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单独显示的消息。
核心疑问
- 我当前添加自定义验证消息的方式是否存在错误?如果有,应该如何修正?
- 如果添加方式是正确的,那该如何正确清除或重置这些自定义添加的验证消息?我已经尝试过强制提交表单、调用
editContext.Validate(),但都无法清除这些自定义消息。另外,在ResetValidation方法中创建当前editContext的新ValidationMessageStore实例时,这个实例里不包含任何消息,我不确定这是否是预期行为。
内容的提问来源于stack exchange,提问作者Will Parsons
相关产品推荐
相关产品推荐

