【问题标题】:FluentValidation on collection of strings字符串集合的 FluentValidation
【发布时间】:2018-04-12 23:33:33
【问题描述】:

我有以下代码:

public partial class CustomerContactCommunicationValidator : AbstractValidator<CustomerCommunication>
{
    public CustomerContactCommunicationValidator()
    {
       CascadeMode = CascadeMode.StopOnFirstFailure;

        RuleFor(x => x.PhoneNumbers).SetCollectionValidator(new FaxPhoneNumberValidator("PhoneNumber"));
        RuleFor(x => x.FaxNumbers).SetCollectionValidator(new FaxPhoneNumberValidator("Faxnumbers"));
    }               
}

public class FaxPhoneNumberValidator : AbstractValidator<string>
{
    public FaxPhoneNumberValidator(string collectionName)
    {
        RuleFor(x => x).Length(0, 35).OverridePropertyName(collectionName);
    }
}

PhoneNumbers 和 FaxNumbers 被声明为 List。

我的单元测试:

    [TestMethod]
    [TestCategory("ValidationTests")]
    public void ShouldHaveErrorWhenPhoneNumberIsLongerThan35Charachters()
    {
        validator.ShouldHaveValidationErrorFor(x => x.PhoneNumbers, new List<string>() { "123456789012345678901234567890123456111" });
    }

    [TestMethod]
    [TestCategory("ValidationTests")]
    public void ShouldNotHaveErrorWhenPhoneNumberIsSmallerThan35Charachters()
    {
        validator.ShouldNotHaveValidationErrorFor(x => x.PhoneNumbers, new List<string>() { "0032486798563" });
    }

第一个测试失败,第二个没有。 此外,当我进行实时测试时,它在大于 35 个字符的电话号码上成功。

我已经看到了关于这个的其他问题:How do you validate against each string in a list using Fluent Validation?

但我真的不明白我做错了什么。

【问题讨论】:

  • 嗨,你试过下面的代码吗?它也适合你吗?

标签: c# fluentvalidation


【解决方案1】:

查看此示例,它可能会澄清您的所有疑问。

验证类:

using FluentValidation;
using System.Collections.Generic;

namespace Test.Validator
{

    public class EmailCollection
    {
        public IEnumerable<string> email { get; set; }

    }

    public class EmailValidator:  AbstractValidator<string>
    {
        public EmailValidator()
        {
            RuleFor(x => x).Length(0, 5);
        }

    }

    public class EmailListValidator: AbstractValidator<EmailCollection>
    {
        public EmailListValidator()
        {
            RuleFor(x => x.email).SetCollectionValidator(new EmailValidator());
        }

    }



}

【讨论】:

    【解决方案2】:

    尝试使用:

    public class CustomerContactCommunicationValidator : AbstractValidator<CustomerCommunication>
    {
       public CustomerContactCommunicationValidator()
       {
           RuleForEach(x => x.PhoneNumbers).Length(0, 35);
           RuleForEach(x => x.FaxNumbers).Length(0, 35);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多