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

.NET Core 7 Web API中Fluent Validation命令对象验证失效求助

问题诊断与解决方案

可能的原因及对应解决方法

1. MediatR验证管道未注册

在Clean Architecture模板中,FluentValidation是通过MediatR的管道行为自动触发请求验证的。如果你的项目未注册ValidationBehavior,针对Command的验证逻辑根本不会被执行。

解决步骤:

  • 确保项目中存在ValidationBehavior类:
public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : IRequest<TResponse>
{
    private readonly IEnumerable<IValidator<TRequest>> _validators;

    public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
    {
        _validators = validators;
    }

    public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken)
    {
        if (_validators.Any())
        {
            var context = new ValidationContext<TRequest>(request);
            var validationResults = await Task.WhenAll(_validators.Select(v => v.ValidateAsync(context, cancellationToken)));
            var failures = validationResults.SelectMany(r => r.Errors).Where(f => f != null).ToList();

            if (failures.Count != 0)
                throw new ValidationException(failures);
        }
        return await next();
    }
}
  • 在Program.cs中注册该管道行为:
services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<CreateActivityCommand>());
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));

2. Command中的Activity属性未正确绑定

如果请求JSON是直接传递Activity字段(如{"Title": ""}),而非嵌套在Activity对象下(如{"Activity": {"Title": ""}}),模型绑定会导致Command.Activity为null,此时RuleFor(v => v.Activity.Title)无法触发验证(若异常被全局处理为200响应,就会出现验证失效的假象)。

解决步骤:

  • 调整请求JSON为嵌套格式:
{
  "Activity": {
    "Title": "",
    "Date": "2024-01-01T00:00:00",
    "Description": "",
    "Category": "",
    "City": "",
    "Venue": ""
  }
}
  • 或修改Command类,将Activity字段平铺(更符合CQRS单一职责原则):
public class Command : IRequest<Unit>
{
    public string Title { get; set; }
    public DateTime Date { get; set; }
    public string Description { get; set; }
    public string Category { get; set; }
    public string City { get; set; }
    public string Venue { get; set; }
}

同步更新Validator和Handler:

// Validator
RuleFor(v => v.Title).NotEmpty().WithMessage("Title is required");

// Handler
var activity = new Activity
{
    Title = request.Title,
    Date = request.Date,
    // 其他字段赋值
};
_dataContext.Activities.Add(activity);

3. Validator未注册到依赖注入容器

如果CreateActivityCommandValidator未被注册到DI容器,MediatR的验证管道无法找到对应验证器,验证逻辑不会执行。

解决步骤:

  • 在Program.cs中注册程序集内所有Validator:
services.AddValidatorsFromAssemblyContaining<CreateActivityCommandValidator>();

4. 空引用保护缺失

当Activity为null时,访问v.Activity.Title会引发空引用异常,若全局异常处理将其转为200响应,也会出现验证失效的假象。可在Validator中先校验Activity非空:

修改Validator:

public CreateActivityCommandValidator(DataContext dataContext)
{
    _dataContext = dataContext;

    RuleFor(v => v.Activity).NotNull().WithMessage("Activity data is required");
    RuleFor(v => v.Activity.Title).NotEmpty().WithMessage("Title is required")
        .When(v => v.Activity != null);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:03:33