6.2.2 Blazor 表单与校验
表单是业务系统中最常见的交互。Blazor 提供 EditForm、输入组件和数据注解校验,帮助你用 C# 描述输入规则和提交行为。
学习目标
- 能使用
EditForm绑定模型并提交。 - 能使用数据注解声明基本校验规则。
- 能展示字段级错误和提交失败提示。
- 能处理提交中、成功和失败状态。
应用场景
- 创建任务、编辑资料、登录注册、后台配置页。
- 表单字段较多,需要统一校验提示。
- 与 ASP.NET Core API 共享部分 DTO 或校验规则。
示例模型
public sealed class CreateTodoFormModel
{
[Required(ErrorMessage = "标题不能为空")]
[StringLength(120, ErrorMessage = "标题不能超过 120 个字符")]
public string Title { get; set; } = string.Empty;
[StringLength(500, ErrorMessage = "备注不能超过 500 个字符")]
public string? Description { get; set; }
}
表单组件
<EditForm Model="model" OnValidSubmit="SubmitAsync">
<DataAnnotationsValidator />
<ValidationSummary />
<label>
标题
<InputText @bind-Value="model.Title" />
<ValidationMessage For="() => model.Title" />
</label>
<label>
备注
<InputTextArea @bind-Value="model.Description" />
<ValidationMessage For="() => model.Description" />
</label>
<button type="submit" disabled="@isSubmitting">
@(isSubmitting ? "提交中..." : "创建任务")
</button>
</EditForm>
@if (!string.IsNullOrWhiteSpace(errorMessage))
{
<p role="alert">@errorMessage</p>
}
@code {
private readonly CreateTodoFormModel model = new();
private bool isSubmitting;
private string? errorMessage;
private async Task SubmitAsync()
{
isSubmitting = true;
errorMessage = null;
try
{
await TodoApi.CreateAsync(model);
}
catch (Exception)
{
errorMessage = "创建任务失败,请稍后再试";
}
finally
{
isSubmitting = false;
}
}
}
重点难点
- 前端校验提升体验,但后端仍必须重复校验。
- 提交中要禁用按钮,避免重复创建。
- 表单模型可以和 API DTO 分开,避免 UI 状态污染接口契约。
- 对服务器返回的字段级错误,需要映射到 Blazor 的校验消息。
常见误区
| 误区 | 推荐做法 |
|---|---|
| 只做前端校验 | 前后端都校验,后端是最终边界 |
| 提交失败只在控制台打印 | 页面展示用户可理解的错误 |
| 表单和实体共用一个类 | 使用专门 Form Model 或 DTO |
练习
- 给截止日期添加校验:不能早于今天。
- 增加提交成功后的清空表单逻辑。
- 把后端字段错误显示到对应输入框下方。