在blazor 中,EditForm 是如何进行验证数据和提交的

111 阅读2分钟

在 Blazor 中,EditForm 是一个专门用于处理表单数据、验证和提交的组件,它依赖 数据注解(Data Annotations)验证服务 实现完整的验证流程。以下是它的核心机制分步解析:


1. 数据绑定与模型关联

通过 Model 参数将表单绑定到数据模型:

<EditForm Model="@person" OnValidSubmit="HandleValidSubmit">
    <DataAnnotationsValidator /> <!-- 启用数据注解验证 -->
    <ValidationSummary /> <!-- 显示所有验证错误摘要 -->

    <InputText @bind-Value="person.Name" />
    <ValidationMessage For="() => person.Name" /> <!-- 显示特定字段错误 -->

    <button type="submit">提交</button>
</EditForm>

2. 验证触发时机

  • 实时验证:用户输入时自动触发(通过 InputBase<T> 派生组件如 InputText)。
  • 提交验证:点击 type="submit" 按钮时,先验证所有字段,再触发 OnValidSubmitOnInvalidSubmit

3. 验证规则定义

使用 数据注解特性 标记模型属性:

public class Person
{
    [Required(ErrorMessage = "姓名不能为空")]
    [StringLength(20, MinimumLength = 3, ErrorMessage = "长度需在3-20字符")]
    public string Name { get; set; }

    [Range(18, 120, ErrorMessage = "年龄需在18-120岁之间")]
    public int Age { get; set; }

    [EmailAddress(ErrorMessage = "请输入有效的邮箱")]
    public string Email { get; set; }
}

4. 验证流程

  1. 数据注解验证器
    DataAnnotationsValidator 组件会扫描模型的数据注解特性,生成验证规则。
  2. 验证上下文
    EditContext 是验证的核心,存储模型状态、字段标识和验证结果。
  3. 验证结果传递
    验证结果通过 ValidationMessageStore 写入 EditContext,并更新 UI(如 ValidationMessage 显示错误)。

5. 提交处理

  • 有效提交OnValidSubmit 仅在所有验证通过时触发,执行数据提交逻辑(如调用 API)。
private async Task HandleValidSubmit()
{
    await Http.PostAsJsonAsync("api/people", person);
}
  • 无效提交OnInvalidSubmit 在验证失败时触发,可自定义处理(如日志记录)。

6. 关键总结

  • 数据注解驱动:通过属性标记声明式定义规则。
  • EditContext 为中心:所有验证状态存储于此,组件通过它通信。
  • 异步验证支持:通过 ValidationRule 可集成远程验证(如检查用户名是否存在)。

通过以上机制,EditForm 实现了从用户输入到数据提交的完整闭环,同时保持代码的可维护性和扩展性。