c# - 使用 WebApi [路由] 属性时 FluentValidation 不起作用

标签 c# asp.net-web-api fluentvalidation model-validation

我在只有一个 HttpGet 方法的 WebApi 项目 Controller 中成功实现了 FluentValidation。当我添加另一个 HttpGet 方法时,我将路由属性添加到这两个方法。即 [Route("Method1")] 和 [Route("Method2")]。

现在,无论我是否输入任何数据,ModelState 都会返回 true。

这是我的代码。

WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        config.Filters.Add(new ValidateModelStateFilter());

        //FluentValidation
        FluentValidationModelValidatorProvider.Configure(config);

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{action}/{id}",
            defaults: new { controller = "Menu", id = RouteParameter.Optional}
        );


    }
}

验证模型状态过滤器

public class ValidateModelStateFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}

Controller

[HttpGet]
[Route("Method1")]
public IHttpActionResult ReadAllMenusByApplication([FromUri] ReadAllMenusByApplicationInput input)
{
        var result = new List<ApplicationMenu>();
        ...
}

输入对象

using FluentValidation;
using FluentValidation.Attributes;

namespace MenuService.Models
{
[Validator(typeof(ReadAllMenusByApplicationInputValidator))]
public class ReadAllMenusByApplicationInput
{
    public ReadAllMenusByApplicationInput() {
        this.ApplicationName = string.Empty;
    }

    /// <summary>
    /// The MenuSystem name of the application
    /// </summary>
    public string ApplicationName { get; set; }
}

public class ReadAllMenusByApplicationInputValidator : AbstractValidator<ReadAllMenusByApplicationInput>
{
    public ReadAllMenusByApplicationInputValidator()
    {
        RuleFor(x => x.ApplicationName).NotEmpty();
    }
}

最佳答案

以本文为引用

Custom Validation in ASP.NET Web API with FluentValidation

您似乎掌握了引用文章中的大部分内容。

检查您的配置顺序。

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Web API configuration and services
        config.Filters.Add(new ValidateModelStateFilter());

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{action}/{id}",
            defaults: new { controller = "Menu", id = RouteParameter.Optional}
        );

        //FluentValidation
        FluentValidationModelValidatorProvider.Configure(config);    
    }
}

FluentValidation 自动将其错误插入到 ModelState 中。您应该包含一条错误消息。

public class ReadAllMenusByApplicationInputValidator : AbstractValidator<ReadAllMenusByApplicationInput> {
    public ReadAllMenusByApplicationInputValidator() {
        RuleFor(x => x.ApplicationName).NotEmpty()
            .WithMessage("The Application Name cannot be blank.");
    }
}

文章中的一些内容超出了您的问题范围。主要是包装响应,但其他一切都应该适合您。

关于c# - 使用 WebApi [路由] 属性时 FluentValidation 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924316/

相关文章:

c# - 无法将方法组转换为 func<long,bool>

c# - 从应用程序中的任何地方访问数据库

c# - 如何在 ASP.NET 中提供自启动事件或警报?

c# - Excel C# 将单元格转换为百分比

c# - 使用 C# 撤消绑定(bind)对象中的更改

asp.net - .NET Core WebAPI + OpenIdDict(凭证流)和 Angular2 客户端 : 401 after successful login (full repro)

servicestack - 使用一个验证器来处理多个请求 DTO?或者单个请求 DTO 的多个验证器?

c# - FluentValidation - 验证包含对象列表的 View 模型

c# - ASP.net web api 返回空对象列表

c# - 客户端没有收到来自 ApiController 的自定义 HttpResponseException