Blazor中自定义ValidationAttribute重载带ValidationContext的IsValid不生效问题
问题根因
- 你重载带
ValidationContext的IsValid方法时,返回ValidationResult没有指定关联的属性名,Blazor会将其识别为模型级验证错误,如果你页面上只放了针对单个字段的<ValidationMessage>组件而没有全局的<ValidationSummary>,自然看不到错误提示。 - 无参数的
IsValid方法返回bool时,框架会自动把错误绑定到当前标注的属性上,所以能正常显示字段级错误。
修复方案
步骤1:修改Test验证特性的IsValid实现
返回ValidationResult的时候,传入第二个参数,把当前验证的属性名加到成员列表里,代码如下:
public class Test : ValidationAttribute { protected override ValidationResult? IsValid(object? value, ValidationContext validationContext) { // 可在这里通过validationContext获取上下文数据、动态生成错误信息 var dynamicErrorMsg = "动态生成的自定义错误内容"; // 关键:第二个参数传入当前验证的属性名,告诉Blazor这是哪个字段的错误 return new ValidationResult(dynamicErrorMsg, new[] { validationContext.MemberName }); } }
validationContext.MemberName是当前标注特性的属性名,不需要硬编码,适配所有标注了该特性的属性。
步骤2:确认页面表单配置正确
EditForm里必须同时包含DataAnnotationsValidator组件和对应属性的ValidationMessage组件,示例结构:
<EditForm Model="@petModel" OnValidSubmit="@HandleSubmit"> <DataAnnotationsValidator /> @* 必须添加,否则DataAnnotations验证特性不会生效 *@ <InputNumber @bind-Value="@petModel.PetAge" /> <ValidationMessage For="@(() => petModel.PetAge)" /> @* 字段级错误提示位置 *@ <button type="submit">提交</button> </EditForm>
扩展说明
如果你确实需要返回全局的模型级错误,不需要指定成员名,只要在表单中添加<ValidationSummary />组件即可展示所有模型级错误。
内容的提问来源于stack exchange,提问作者Guillermo Perez
相关产品推荐
相关产品推荐

