【问题标题】:Fluent Validation Not working for List Object流利的验证不适用于列表对象
【发布时间】:2017-05-02 15:38:05
【问题描述】:

我正在尝试验证我的 webApi 2 中的输入对象列表。

但它没有验证。 Modelstate 始终设置为 true。

示例代码:

public class A
{
    public int Id { get; set; }
    public string Name { get; set; }
} 

public class ClassAValidator : AbstractValidator<A>
{
    public classAValidator()
    {
        RuleSet("ClassA",()=>{
            RuleFor(x => x.Id).NotEmpty().WithMessage("The Idcan't be Empty or Zero");
            RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length");
        });
    }
}

注意:我们需要准确的字符串字段为 6 个字符。

API:

 [HttpPut]
 public async Task<IHttpActionResult> Put([FromBody] List<A> alist)
 {
     if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A"); 
     // Model State is Always true
 }

谁能指出我错过了什么?

更新: 我试过了Should i create a new Type for Collection in FluentValidation?

但仍然有同样的问题。

已解决的更新:

问题是规则集的使用导致验证未触发。在删除“RuleSet”时,即使没有定义 List[A] Validator 类,它也可以工作。

来自 Jeremy Skinner 的消息:第一个问题是您的规则被包装在一个规则集中,因此它们永远不会被执行。规则集是可选的,自动集成仅调用不在规则集中的规则。

【问题讨论】:

    标签: c# asp.net asp.net-web-api fluentvalidation


    【解决方案1】:

    首先,ModelState.IsValid 是一个 ASP.NET MVC 构造,用于验证(默认情况下)模型绑定是否正确完成。除非您在 MVC 配置中设置它,否则它与 FluentValidation 无关。

    您需要确保正在调用验证器。要验证A 的列表及其元素,您需要两个验证器:一个用于A 类型,一个用于A 的列表/集合/IEnumerable:

    public class ClassAValidator : AbstractValidator<A>
    {
        public ClassAValidator()
        {
            RuleFor(x => x.Id).NotEmpty().WithMessage("Id can't be empty");
            RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10");
        }
    }
    
    public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>>
    {
        public ClassACollectionValidator ()
        {
            RuleFor(x =>x).SetCollectionValidator(new ClassAValidator());
        }
    }
    

    然后您可以按如下方式验证您的列表

     [HttpPut]
     public async Task<IHttpActionResult> Put([FromBody] List<A> alist)
     {
         if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A"); 
    
         var validator = new ClassACollectionValidator();
         var result = validator.Validate(alist);
     }
    

    或者,您可以按如下方式组合两个验证器:

    public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>>
    {
        public ClassACollectionValidator ()
        {
            RuleForEach(x => x.Id).NotEmpty().WithMessage("Id can't be empty");
            RuleForEach(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10");
        }
    }
    

    【讨论】:

      【解决方案2】:

      问题是规则集的使用导致验证未触发。在删除“RuleSet”时,即使没有定义 List[A] Validator 类,它也能正常工作。

      来自 Jeremy Skinner 的消息:第一个问题是您的规则被包装在一个规则集中,因此它们永远不会被执行。规则集是可选的,自动集成只调用不在规则集中的规则。

      【讨论】:

        【解决方案3】:

        您似乎需要将 RuleSet 包装在构造函数中,至少根据此示例。

        https://www.exceptionnotfound.net/custom-validation-in-asp-net-web-api-with-fluentvalidation/

        public class ClassAValidator : AbstractValidator<A>
        {
            Public ClassAValidator()
            {
              RuleSet("ClassA",()=>{
              RuleFor(x => x.Id).NotEmpty().WithMessage("The Id can't be Empty or Zero");
              RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length");
              });
            }
        
        }
        

        【讨论】:

        • 抱歉忘记添加构造函数了.. 是的,我确实有
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多