在 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"按钮时,先验证所有字段,再触发OnValidSubmit或OnInvalidSubmit。
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. 验证流程
- 数据注解验证器
DataAnnotationsValidator组件会扫描模型的数据注解特性,生成验证规则。 - 验证上下文
EditContext是验证的核心,存储模型状态、字段标识和验证结果。 - 验证结果传递
验证结果通过ValidationMessageStore写入EditContext,并更新 UI(如ValidationMessage显示错误)。
5. 提交处理
- 有效提交:
OnValidSubmit仅在所有验证通过时触发,执行数据提交逻辑(如调用 API)。
private async Task HandleValidSubmit()
{
await Http.PostAsJsonAsync("api/people", person);
}
- 无效提交:
OnInvalidSubmit在验证失败时触发,可自定义处理(如日志记录)。
6. 关键总结
- 数据注解驱动:通过属性标记声明式定义规则。
- EditContext 为中心:所有验证状态存储于此,组件通过它通信。
- 异步验证支持:通过
ValidationRule可集成远程验证(如检查用户名是否存在)。
通过以上机制,EditForm 实现了从用户输入到数据提交的完整闭环,同时保持代码的可维护性和扩展性。