【问题标题】:How to validate requests with FluentValdation instead of data annotations?如何使用 FluentValdation 而不是数据注释来验证请求?
【发布时间】:2021-08-19 08:29:16
【问题描述】:

我使用以下设置创建了一个新的 .Net 5 Web API

public class MyController : ControllerBase
{
    [HttpGet("{Title}")]
    public ActionResult<string> Get([FromRoute] RouteModel routeModel)
    {
        return Ok(routeModel);
    }
}

public class RouteModel
{
    [MinLength(3)]
    public string Title { get; set; }
}

请求验证工作正常。由于我使用的是 FluentValidation,因此我安装了该软件包

FluentValidation.AspNetCore v10.3.0

并将Startup.ConfigureServices 方法更新为

public void ConfigureServices(IServiceCollection services)
{
    services.AddValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies());
    services.AddControllers();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication", Version = "v1" });
    });
}

我没有使用数据注释,而是从 RouteModel.Title 中删除了数据注释并创建了这个验证器

public class RouteModelValidator : AbstractValidator<RouteModel>
{
    public RouteModelValidator()
    {
        RuleFor(model => model.Title).MinimumLength(3);
    }
}

我希望ValidationException,如果标题的长度小于 3,这将导致 500 状态代码。但似乎不再有验证触发器,请求总是通过。

有人知道缺少什么吗?

【问题讨论】:

  • 您能分享一下与 FluentValidation 注册相关的 ConfigureServices 方法中的所有代码吗?
  • 当然,我更新了我的问题
  • 请尝试一下:services.AddFluentValidation(x =&gt; x.RegisterValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()));
  • 你可以在这里看到 3 个文件 pastebin.com/KVPwtWjm 当我使用 title = "a" 发送请求时,我会期待一个例外。该代码有异常吗?
  • 啊,解决了 :) 如果你愿意,你可以创建一个答案?

标签: c# .net-5 fluentvalidation


【解决方案1】:
  1. 将 FluentValidation 注册为

    services
      .AddFluentValidation(x => x.RegisterValidatorsFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()));
    
  2. ApiController 属性标记你的控制器

    [ApiController]
    public class MyController : ControllerBase
    

否则,您应该手动验证ModelState,例如:

[HttpGet("{Title}")]
public ActionResult<string> Get([FromRoute] RouteModel routeModel)
{
   if (!ModelState.IsValid)
   {
      return BadRequest("bad");
   }
   return Ok(routeModel);
}

Some info:

这取决于控制器的类型 - 如果您使用 [ApiController] 属性,那么 ASP.NET 将自动生成错误请求结果。如果您不使用 ApiController 属性(即对于非 api 控制器,例如返回视图的位置),那么您需要手动处理 ModelState.IsValid 检查(请参阅上面的 asp.net 文档链接)。但同样,这是 ASP.NET 的约定,它不是 FluentValidation 的特性。

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多