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

FluentValidation 10.3.3自定义PropertyValidator客户端验证不触发问题

问题根因

FluentValidation 10.3.3版本对自定义验证器的客户端验证触发逻辑做了调整,你遇到的未触发问题主要由以下几点导致:

  1. 自定义服务端验证器FileSizeValidator<T>未显式声明支持客户端验证,10.x版本默认会将自定义验证器识别为仅服务端验证,直接跳过客户端逻辑执行
  2. 服务注册顺序错误,ConfigureClientsideValidation配置必须放在MVC/RazorPages服务注册之后,否则配置会被MVC默认初始化逻辑覆盖
  3. 若验证规则加了When/Unless等服务端条件,默认会被判定为不适用于客户端验证,直接跳过客户端工厂调用

解决方案

步骤1:调整服务注册顺序

先注册MVC相关服务,再配置FluentValidation的客户端验证:

// 优先注册MVC/ Razor Pages服务
services.AddControllersWithViews();
// 再注册FluentValidation
services.AddFluentValidation(options =>
{
    // 注册包含FileSizeValidator的程序集下所有验证器
    options.RegisterValidatorsFromAssemblyContaining<FileSizeValidator<object>>();
    // 配置客户端验证工厂
    options.ConfigureClientsideValidation(clientside =>
    {
        clientside.ClientValidatorFactories[typeof(FileSizeValidator<>)] = (_, rule, component) =>
            new FileSizeClientValidator(rule, component);
    });
});

步骤2:给自定义验证器添加客户端支持标记

在FileSizeValidator<T>的构造函数中显式声明支持客户端验证:

public class FileSizeValidator<T> : PropertyValidator<T, IFormFile>
{
    public FileSizeValidator(long maxSize)
    {
        // 核心配置:声明该验证器支持客户端验证
        Options.SupportsClientsideValidation = true;
    }

    // 保留你原有服务端验证逻辑
    public override bool IsValid(ValidationContext<T> context, IFormFile value)
    {
        if (value == null) return true;
        return value.Length <= 你定义的文件大小上限;
    }
}

步骤3:视图端验证配置检查

确保视图中引入了客户端验证依赖脚本,且表单元素使用asp-for等TagHelper生成:

<!-- 必须引入的客户端验证依赖 -->
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

<!-- 表单元素必须使用asp-for TagHelper才能自动生成验证属性 -->
<input asp-for="UploadFile" type="file" />
<span asp-validation-for="UploadFile"></span>

可选:提取验证参数生成动态验证属性

如果需要把服务端验证的参数(比如最大文件大小)传递到客户端,可以在FileSizeClientValidator中从IRuleComponent提取参数:

public override void AddValidation(ClientModelValidationContext context)
{
    MergeAttribute(context.Attributes, "data-val", "true");
    // 提取服务端验证器传入的最大文件大小参数
    var maxSize = (long)Component.UnwrappedArgs[0];
    MergeAttribute(context.Attributes, "data-val-filesize", $"文件大小不能超过{maxSize/1024/1024}MB");
    MergeAttribute(context.Attributes, "data-val-filesize-max", maxSize.ToString());
}

注意事项

如果你的FileSizeValidator对应的验证规则加了When/Unless等服务端条件,默认会跳过客户端验证,可在条件配置后追加.When(e => false, ApplyConditionTo.CurrentValidator)强制触发客户端逻辑,或移除无关的服务端条件。


内容的提问来源于stack exchange,提问作者Angius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:15:04