Tag: fluentvalidation

FluentValidation规则链接不会在第一次失败时停止

我有一个模特: public class DTO { public int[] StatementItems { get; set; } } 我要validation的是: StatementItems不为null StatementItems不为空 StatementItems不包含任何重复的ID 我创建的validation规则链是: RuleFor(x => x.StatementItems).NotNull().NotEmpty().Must(x => x.Distinct().Count() == x.Count()); 我有一个测试: _validator.ShouldHaveValidationErrorFor(x => x.StatementItems, null as int[]); 当我运行测试传递一个空值时,我希望它在链的第一个规则( NotNull() )上失败并停在那里。 但是,它抱怨Must()使用的lamda值为null。 如果NotNull()失败,我认为不应该运行Must() ,这是错误的吗? 如果是这样,该规则应如何编写? 谢谢

如何unit testing简单属性有validation器设置?

我对多个模型对象中的某些属性有类似的规则,我想用自定义属性validation器替换它们,以避免unit testing中的代码重复。 我有我的财产validation人: public class IntIdPropertyValidator: PropertyValidator { public IntIdPropertyValidator() : base(“Property {PropertyName} should be greater than 0”) { } protected override bool IsValid(PropertyValidatorContext context) { var value = (int)context.PropertyValue; return value > 0; } } 并在模型validation器类中连接它: public class SomeRequestValidator : AbstractValidator { public SomeRequestValidator() { RuleFor(x => x.Id).SetValidator(new IntIdPropertyValidator()); } } 试图测试: [Test] public […]

什么时候必须使用FluentValidation?

当dropdownlist值为yes且字段必须为date时,我正在尝试使用FluentValidation validaton。 它是在dropdownlist yes检查date 。 但是当我选择No时也会显示validation,但它仍然表示Must be date 。 如果下拉列表值不是,则不应再validation。 我们怎么能这样做? RuleFor(x => x.DtPublishedTimeText) .NotEmpty() .When(HasMaterialPublishedElseWhereText) .WithMessage(“Required Field”) .Must(BeAValidDate) .WithMessage(“Must be date”); private bool BeAValidDate(string val) { DateTime date; return DateTime.TryParse(val, out date); } private bool HasMaterialPublishedElseWhereText(MeetingAbstract model) { return model.HasMaterialPublishedElseWhereText != null && model.HasMaterialPublishedElseWhereText.Equals(“yes”); }

使用FluentValidation的WithMessage方法和命名参数列表

我正在使用FluentValidation,我想格式化一个对象的属性值的消息。 问题是我对C#中的表达式和委托的经验很少。 FluentValidation已经提供了一种使用格式参数执行此操作的方法。 RuleFor(x => x.Name).NotEmpty() .WithMessage(“The name {1} is not valid for Id {0}”, x => x.Id, x => x.Name); 我想做这样的事情,以避免在我更改参数的顺序时更改消息字符串。 RuleFor(x => x.Name).NotEmpty() .WithMessage(“The name {Name} is not valid for Id {Id}”, x => new { Id = x.Id, Name = x.Name }); 原始方法签名如下所示: public static IRuleBuilderOptions WithMessage( this IRuleBuilderOptions rule, string errorMessage, […]

SimpleInjector和FluentValidationFactory

我正在尝试自动validation我的视图模型,我知道我可以添加一个属性来指定我的validation但是有一个选项可以设置工厂来自动化所有这些,我看着: 这个答案并提出来了这使用简单的注射器3.1: public class CustomValidatorFactory:ValidatorFactoryBase { private readonly Container siContainer; public CustomValidatorFactory(Container siContainer) { var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList(); this.siContainer = siContainer; this.siContainer.Register(typeof(IValidator), assemblies); } public override IValidator CreateInstance(Type validatorType) { //var instances = siContainer.GetAllInstances(validatorType); var implementation = ((IServiceProvider)siContainer).GetService(validatorType); var validatorInstance = implementation != null ? (implementation as IValidator) : null; return validatorInstance; } } 然后视图模型可以是这样的 […]

将validation添加到MediatR行为管道?

我正在使用内置容器ASP.NET Core和支持“行为”管道的 MediatR 3: public class MyRequest : IRequest { // … } public class MyRequestHandler : IRequestHandler { public string Handle(MyRequest message) { return “Hello!”; } } public class MyPipeline : IPipelineBehavior { public async Task Handle(TRequest request, RequestHandlerDelegate next) { var response = await next(); return response; } } // in `Startup.ConfigureServices()`: services.AddTransient(typeof(IPipelineBehavior), […]

子属性的选择性validation – MVC中的流畅validation

我正在使用Fluent Validation与Ninject.Web.Mvc.FluentValidation库自动连接所有validation器(并使用dependency injection来创建validation器)。 我创建了以下模型: public class Parent { public string Name { get; set; } public Child Child1 { get; set; } public Child Child2 { get; set; } } public class Child { public string ChildProperty { get; set; } } 使用以下validation器: public class ParentValidator : AbstractValidator { public ParentValidator() { RuleFor(model => model.Name).NotEmpty(); […]

FluentValidation调用RuleSet和Common Rules

我有以下课程 public class ValidProjectHeader : AbstractValidator { public ValidProjectHeader() { RuleFor(x => x.LobId).Must(ValidateLOBIDExists); RuleFor(x => x.CreatedByUserId).NotEmpty(); RuleFor(x => x.ProjectManagerId).NotEmpty(); RuleFor(x => x.ProjectName).NotEmpty(); RuleFor(x => x.SalesRepId).NotEmpty(); RuleFor(x => x.DeliveryDate).NotEmpty(); RuleFor(x => x.ProjectStatusId).NotEmpty(); RuleFor(x => x.DeptartmentId).NotEmpty(); RuleFor(x => x.CustomerId).NotEmpty(); RuleSet(“Insert”, () => { RuleFor(x => x.ProjectLines).Must(ValidateProjectLines).SetCollectionValidator(new ValidProjectLine()); }); RuleSet(“Update”, () => { RuleFor(x => x.ProjectLines).SetCollectionValidator(new ValidProjectLine()); }); […]

Web API中的依赖项注入validation

在MVC中,我可以创建一个可以使用依赖关系的模型validation器。 我通常使用FluentValidation。 例如,这允许我检查帐户注册是否未使用电子邮件地址(注意:这是一个简化的示例!): public class RegisterModelValidator : AbstractValidator { private readonly MyContext _context; public RegisterModelValidator(MyContext context) { _context = context; } public override ValidationResult Validate(ValidationContext context) { var result = base.Validate(context); if (context.Accounts.Any(acc => acc.Email == context.InstanceToValidate.Email)){ result.Errors.Add(new ValidationFailure(“Email”, “Email has been used”)); } return result; } } 使用FluentValidation的Web API不存在此类集成。 已经有过几次 尝试 ,但都没有处理dependency injection方面,只能使用静态validation器。 这很困难的原因是由于MVC和Web […]

C#FluentValidation用于类的层次结构

我有一个数据类层次结构 public class Base { // Fields to be validated } public class Derived1 : Base { // More fields to be validated } public class Derived2 : Base { // More fields to be validated } 使用FluentValidation框架validationDerived1和Derived2的适当方法是什么,而不重复Base类字段的规则?