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

Blazor EditContext 非预期触发验证问题排查

问题分析与修复

你的问题核心在于validationMessageStore始终绑定旧的EditContext,导致清理验证消息的操作无法作用于新创建的表单上下文,加上代码里的变量名笔误,最终引发验证消息残留的问题。

具体修复点

  1. 修正变量名笔误:将代码里的EditContext exitContext;改为EditContext editContext;,避免上下文对象未正确赋值。
  2. 同步绑定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:12:08