Blazor EditContext 非预期触发验证问题排查
问题分析与修复
你的问题核心在于validationMessageStore始终绑定旧的EditContext,导致清理验证消息的操作无法作用于新创建的表单上下文,加上代码里的变量名笔误,最终引发验证消息残留的问题。
具体修复点
- 修正变量名笔误:将代码里的
EditContext exitContext;改为EditContext editContext;,避免上下文对象未正确赋值。 - 同步绑定ValidationMessageStore:每次创建新的
EditContext时,必须为其重新实例化对应的ValidationMessageStore,确保验证消息的清理和更新都针对当前表单上下文。
修复后的完整代码
<div> <EditForm EditContext="@editContext"> <DataAnnotationsValidator /> <ValidationSummary /> <!-- 示例输入控件 --> <InputText @bind-Value="formFields.ItemNumber" placeholder="物料编号" /> <InputNumber @bind-Value="formFields.Quantity" placeholder="数量" /> <InputText @bind-Value="formFields.SubmitterInitials" placeholder="提交人首字母" /> <button @onclick="OnAddClicked">添加</button> </EditForm> <!-- 已添加项展示 --> @foreach(var item in items) { <div>@item.ItemNumber | 数量:@item.Quantity | 提交人:@item.SubmitterInitials</div> } <button @onclick="SubmitCollection">提交集合</button> </div> @code{ ObservableCollection<FormFieldsModel> items = new(); FormFieldsModel? formFields; EditContext editContext; ValidationMessageStore validationMessageStore; protected override async Task OnInitializedAsync() { formFields = new FormFieldsModel(); editContext = new EditContext(formFields); validationMessageStore = new(editContext); } public void OnAddClicked() { validationMessageStore.Clear(); if (!editContext.Validate()) return; items.Add(formFields); ClearInput(); } public void ClearInput() { formFields = new FormFieldsModel { SubmitterInitials = formFields.SubmitterInitials }; // 为新上下文创建对应的验证消息存储 editContext = new EditContext(formFields); validationMessageStore = new(editContext); editContext.NotifyValidationStateChanged(); } public void SubmitCollection() { // 此处编写提交集合到API的逻辑 } public class FormFieldsModel { [Required(ErrorMessage = "物料编号不能为空")] public string ItemNumber {get; set;} = string.Empty; [Range(1, int.MaxValue, ErrorMessage = "数量必须大于0")] public int Quantity {get; set;} [Required(ErrorMessage = "提交人首字母不能为空")] public string SubmitterInitials {get; set;} = string.Empty; } }
额外说明
- 给
FormFieldsModel的属性添加数据注解(如[Required]、[Range])是验证逻辑生效的前提,否则editContext.Validate()不会触发有效验证。 - 重置表单时必须同步更新
EditContext和对应的ValidationMessageStore,才能彻底清除旧的验证状态,确保新表单的验证逻辑独立运行。
内容的提问来源于stack exchange,提问作者M Kenyon II
相关产品推荐
相关产品推荐

