Blazor中向ValidationMessageStore新增错误后ValidationSummary未更新问题
问题解决方案
问题本质是手动往
ValidationMessageStore添加错误后,没有通知EditContext校验状态发生了变更,仅调用StateHasChanged只能触发组件重渲染,但ValidationSummary组件是监听EditContext的校验状态变更事件来更新错误展示的,因此不会刷新。
修复步骤
替换ExecuteLogin方法里的StateHasChanged()调用,改为调用EditContext的NotifyValidationStateChanged()方法,该方法会主动触发所有校验相关组件的状态更新,包括ValidationSummary和对应字段的ValidationMessage。
修改后代码示例:
private async Task ExecuteLogin() { var result = await _authenticationManager.Login(model); if (result.Succeeded) { // 登录成功逻辑:通知用户+跳转首页 } else { // 先清空之前的自定义错误,避免重复叠加 _messageStore?.Clear(); foreach (var message in result.Messages) { if (message == "Invalid Credentials.") { _messageStore?.Add(() => model.Email, "Invalid Credentials"); _messageStore?.Add(() => model.Password, "Invalid Credentials"); _messageStore?.Add(() => model.Password, "Another Error for testing"); } else { // 其他错误处理逻辑 } } // 所有错误添加完成后,统一通知EditContext校验状态变更 editContext?.NotifyValidationStateChanged(); } }
可复用优化建议
如果要在多个场景复用自定义校验错误添加逻辑,可以封装为EditContext的扩展方法,避免重复写代码:
public static class EditContextExtensions { public static void AddCustomFieldError<T>(this EditContext editContext, Expression<Func<T>> fieldAccessor, string errorMessage, ValidationMessageStore messageStore) { messageStore.Add(fieldAccessor, errorMessage); } public static void RefreshValidationDisplay(this EditContext editContext) { editContext.NotifyValidationStateChanged(); } }
补充说明
你之前修改输入内容时所有错误都能显示,是因为输入操作会触发EditContext的OnFieldChanged事件,该事件会连带触发校验状态更新,因此之前存在ValidationMessageStore里的错误也会被同步渲染到ValidationSummary中。
内容的提问来源于stack exchange,提问作者Taladan
相关产品推荐
相关产品推荐

