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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:45:03