使用WebApi [Route]属性时,c# – FluentValidation不起作用

我在我的WebApi项目控制器中成功实现了FluentValidation,该控制器只有一个HttpGet方法.当我添加另一个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}
        );


    }
}

ValidateModelStateFilter

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

调节器

[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",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.");
    }
}

本文的一些内容超出了您的问题范围.主要包装响应,但其他一切应该适合你.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


c语言数组越界会怎么样
c语言指针怎么等于数组
c语言数组怎么存入文字
c语言中怎么显示数组
c语言数组元素怎么选
c语言数组怎么累加
c语言数组符号怎么输入
c语言怎么用长数组
c语言数组函数怎么输入
c语言数组怎么去掉差异
c语言怎么求解数组
c语言数组怎么用变量
c语言怎么申明数组
c语言怎么控制数组
c语言怎么计算数组长度
c语言数组怎么插星号
c语言数组怎么加长度
c语言中怎么输出数组
c语言怎么记住数组边界
c语言数组怎么输入符号