标签: fluentvalidation

FluentValidation 与异常消息的集成测试

我正在使用流畅的验证如下:

public class ProjectValidator : AbstractValidator<Project>
{
    public ProjectValidator()
    {
        RuleFor(project => project.Name).NotEmpty().WithMessage("Project name cannot be empty.");
    }
}
Run Code Online (Sandbox Code Playgroud)

在某些服务中:

IValidator<Project> _projectValidator;
_projectValidator.ValidateAndThrow(project);
Run Code Online (Sandbox Code Playgroud)

集成测试的一部分:

var validationException = Assert.Throws<ValidationException>(() => projectRepository.SaveOrUpdate(project));
Assert.That(validationException.Message, Is.EqualTo("Project name cannot be empty."));
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为validationException 可能包含许多错误。即使它只包含一个错误,字符串也如下所示:

验证失败:-- 项目名称不能为空。

您将如何检查验证结果/包含指定的验证消息?:

项目名称不能为空。

c# nunit unit-testing fluentvalidation

4
推荐指数
1
解决办法
1940
查看次数

不区分大小写与 Fluent 验证进行比较

我未能成功使用Fluent Validations实现不区分大小写的比较。我只是想比较两个电子邮件字段并忽略大小写。

目前的规则是:

RuleFor(x => x.EmailAddress).NotEmpty().Length(5, 200).EmailAddress();
RuleFor(x => x.ConfirmEmailAddress).NotEmpty().Equal(x => x.EmailAddress).WithMessage("Emails must match");
Run Code Online (Sandbox Code Playgroud)

为了添加不区分大小写的要求,我考虑通过 equal 调用传递比较器,但这似乎不起作用。

RuleFor(x => x.ConfirmEmailAddress).NotEmpty().Equal(x => x.EmailAddress, StringComparer.CurrentCultureIgnoreCase).WithMessage("Emails must match"); 
Run Code Online (Sandbox Code Playgroud)

理想情况下,如果可能的话,我希望在客户端进行不区分大小写的比较。有人能够提供如何实现这一目标的指导吗?

我当前使用的 NuGet 包是:

<package id="FluentValidation" version="5.1.0.0" targetFramework="net45" />
<package id="FluentValidation.MVC4" version="5.1.0.0" targetFramework="net45" />
Run Code Online (Sandbox Code Playgroud)

c# string-comparison fluentvalidation

4
推荐指数
1
解决办法
4366
查看次数

如何在 FluentValidation 中使用 Reflection?

我有一个场景,我想使用反射来使用 FluentValidation 进行验证。像这样的事情:

public class FooValidator : AbstractValidator<Foo>
{
    public FooValidator(Foo obj)
    {
        // Iterate properties using reflection
        var properties = ReflectionHelper.GetShallowPropertiesInfo(obj);
        foreach (var prop in properties)
        {
            // Create rule for each property, based on some data coming from other service...
            //RuleFor(o => o.Description).NotEmpty().When(o => // this works fine when foo.Description is null
            RuleFor(o => o.GetType().GetProperty(prop.Name)).NotEmpty().When(o =>
            {
                return true; // do other stuff...
            });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

调用ReflectionHelper.GetShallowPropertiesInfo(obj)返回对象的“浅层”属性。然后,我为每个属性创建一条规则。这是我获取对象属性的代码:

public static class ReflectionHelper
{
    public static IEnumerable<PropertyInfo> …
Run Code Online (Sandbox Code Playgroud)

.net c# reflection validation fluentvalidation

4
推荐指数
1
解决办法
2493
查看次数

我应该在 FluentValidation 中为集合创建一个新类型吗?

我试图找出在 FluentValidation 中是否有可用的方法,它允许在根级别为验证器验证集合。

例如,如下所示,一个验证器可CustomerValidator用于一个类Customer。使用 FluentValidation;

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors; …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net validation fluentvalidation

4
推荐指数
1
解决办法
585
查看次数

嵌套属性的FluentValidation消息

我有一个复杂属性的类:

public class A
{
    public B Prop { get; set; }
}

public class B
{
    public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个验证器:

public class AValidator : AbstractValidator<A>
{
    public AValidator()
    {
        RuleFor(x => x.A.Id).NotEmpty().WithMessage("Please ensure you have selected the A object");            
    }
}
Run Code Online (Sandbox Code Playgroud)

但在A.Id的客户端验证期间,我仍然有一个默认的val消息:"'Id'不能为空".如何从验证器将其更改为我的字符串?

asp.net validation fluentvalidation

4
推荐指数
3
解决办法
3947
查看次数

流畅验证失败后如何调用方法

如果流畅的验证方法失败,我想运行一个方法。

RuleFor(x => x.SheepName)
            .Must(x => x.SheepName == null)
            .When(x => x.HasSheep == false)
            .Otherwise(callMethod());
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,如果 HasSheep 值为 false 但仍然给出了 SheepName,那么我想运行一个方法(在示例中该方法称为“callMethod()”)。

我已经编写了 .Otherwise 语句,因此寻找整行 '.Otherwise(callMethod());' 的内容 需要是..

c# validation fluentvalidation

4
推荐指数
1
解决办法
948
查看次数

Razor 页面中的流畅验证

基于此页面,我正在尝试制作一个使用流畅验证的剃刀页面。它似乎已经检查过,但我不确定为什么错误消息不会显示。

这是我到目前为止所做的:

cshtml.cs:

CreateCommandValidator CreateValidator = new CreateCommandValidator();
var createCheck = CreateValidator.Validate(NewItem);
foreach (ValidationFailure fail in createCheck.Errors)
{
     ModelState.AddModelError(fail.PropertyName, fail.ErrorMessage);
}
return Page();
Run Code Online (Sandbox Code Playgroud)

.cshtml:

<label class="col-form-label">Name</label>
<input asp-for="NewItem.Name" type="text" class="form-control mb-2"/>
<span asp-validation-for="NewItem.Name" class="text-danger"></span>
Run Code Online (Sandbox Code Playgroud)

创建命令验证器:

RuleFor
     (Item => Item.Name)
     .NotEmpty().WithMessage("The name cannot be empty")
     .Length(1, 100);
Run Code Online (Sandbox Code Playgroud)

ValidationFailure 能够检测到错误消息,但不确定为什么它不会显示在页面上。有什么想法吗?提前致谢!

error-handling fluentvalidation razor asp.net-core razor-pages

4
推荐指数
1
解决办法
3114
查看次数

FluentValidation 返回错误时如何返回自定义响应?

我用来FluentValidation验证我的输入ASP.NET Core 3.1 Web API。我用“自动”方式来做。所以在我的Startup课堂上我有这个:

        services.AddControllers()
            .AddFluentValidation(opt =>
            {
                opt.RegisterValidatorsFromAssemblyContaining(typeof(UserInputValidator));
            });
Run Code Online (Sandbox Code Playgroud)

这样,FluentValidation就可以神奇地验证上述程序集的所有输入,而无需其他代码。非常甜蜜,但是......响应格式与我返回时使用的响应格式不同BadRequest。这是 FluentValidation 格式:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|3b037c98-40d28ab8553d6989.",
    "errors": {
        "UserId": [
            "'User Id' must be greater than '0'."
        ],
        "Score": [
            "'Score' must be between 0 and 500. You entered 900."
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我宁愿有:

{
    "code": 123456,
    "message": "One or more validation errors occurred.",
    "errors": [
        "'User Id' …
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation .net-core asp.net-core asp.net-core-webapi

4
推荐指数
1
解决办法
8251
查看次数

FluentValidation:AddValidatorsFromAssemblyContaining&lt;T&gt; 导致 IValidator&lt;T&gt; 未注册

我尝试使用 FluentValidation 进行验证,object.GetType()而不是通过注入在编译时了解类型IValidator<T>,但我得到的是null值而不是有效的验证器。

组织+验证者

namespace ConsoleApp44
{
    internal class Organisation
    {
        public string? Name { get; set; }
    }

    internal class OrganisationValidator: AbstractValidator<Organisation>
    {
        public OrganisationValidator()
        {
            RuleFor(x => x.Name).NotEmpty();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用它的控制台应用程序

var services = new ServiceCollection();
services.AddValidatorsFromAssemblyContaining<OrganisationValidator>();
services.Add(ServiceDescriptor.Scoped(typeof(IValidatorFactory), typeof(ServiceProviderValidatorFactory)));

var sp = services.BuildServiceProvider();
var org = new Organisation();
var validationFactory = sp.GetRequiredService<IValidatorFactory>(); // Not null
var validator = validationFactory.GetValidator(org.GetType()); // Null
validator = validationFactory.GetValidator<Organisation>(); // Null
validator = sp.GetRequiredService<IValidator<Organisation>>(); // Exception, …
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation

4
推荐指数
1
解决办法
6340
查看次数

FluentValidation即服务

我正在使用FluentValidation 2来验证某些实体.我想创建一个IValidationService我可以传递到其他服务,以允许他们执行验证.我想像这样揭露它:

public interface IValidationEngine
{
    IEnumerable<ValidationError> Validate<T>(T entity);
}
Run Code Online (Sandbox Code Playgroud)

哪个ValidationError类封装了我的验证错误.理想情况下,我不想在我的某个服务(例如OrderValidator)中公开特定的验证器.我希望验证服务能够构建/找到正确的验证器.FV是否内置了用于查找特定类型的验证器(以及内部缓存)的内容?或者,我是否必须走这IValidatorFactory条路线,然后将每个验证器连接到我的IoC容器?

.net c# fluentvalidation

3
推荐指数
1
解决办法
2129
查看次数