标签: fluentvalidation

使用 FluentValidation 时向类添加 DataAnnotation

我使用 FluentValidation 框架向 MVC 项目中的模型添加验证和注释。

我需要将数据注释添加到模型的类级别。即,模型需要添加 DisplayColumn 属性。但是,由于我使用 FluentValidation(并且将应用程序的 ModelMetadataProvider 设置为使用 FluentValidation),即使我将 DisplayColumn 属性放在模型类上,它也不会被使用。但是,我找不到使用 FluentValidation 添加该注释的方法。

有谁知道我如何让它发挥作用?

谢谢

asp.net-mvc fluentvalidation data-annotations

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

FluentValidation:使用 ValidationContext 进行验证

我在当前项目中使用 FluentValidation。

最近我偶然发现了 AbstractValidators 验证方法

ValidationResult IValidator.Validate(ValidationContext<T> validationContext)
Run Code Online (Sandbox Code Playgroud)

我没有找到任何关于为什么使用这种方法的用例。何时以及如何使用此方法进行验证有用?

感谢您提供任何意见。

c# validation .net-4.0 mvvm fluentvalidation

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

使用嵌套验证对复杂模型进行单元测试

我正在使用fluentvalidation进行模型验证.我有一个类,有几个嵌套类或类集合,每个类都有自己的IValidator.最初我正在做这样的事情来设置嵌套的验证器:

RuleFor(foo => foo.Header).SetValidator(new FooHeaderValidator());
Run Code Online (Sandbox Code Playgroud)

这非常有效.

当我开始实现更多的嵌套验证器时,我开始意识到我的单元测试对于顶级验证是多么脆弱.基本上,对子验证器的任何更改都可能导致意外行为并导致测试失败.显然这是由于我直接实例化了子验证器.我现在正在通过构造函数注入获取该依赖项.这让我嘲笑了FooHeaderValidator.

我现在测试失败了null reference,来自某个地方的例外来自流畅的验证.我只能假设某个地方有人要求我的模拟不提供.这是来自fluentvalidation的堆栈跟踪:

   at FluentValidation.Validators.ChildValidatorAdaptor.Validate(PropertyValidatorContext context)
   at FluentValidation.Validators.DelegatingValidator.Validate(PropertyValidatorContext context)
   at FluentValidation.Internal.PropertyRule.InvokePropertyValidator(ValidationContext context, IPropertyValidator validator, String propertyName)
   at FluentValidation.Internal.PropertyRule.<Validate>d__8.MoveNext()
   at System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList(IEnumerable`1 source)
   at FluentValidation.AbstractValidator`1.Validate(ValidationContext`1 context)
   at FluentValidation.AbstractValidator`1.Validate(T instance)
Run Code Online (Sandbox Code Playgroud)

有没有人遇到这个,知道我错过了什么?我是否因为嘲笑这些验证器而疯狂?

.net tdd mocking fluentvalidation

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

FluentValidation传递参数

我几小时前才发现FluentValidation,我想重写所有的验证逻辑,所以它只使用FV.

我有ATM的问题是我想使用来自输入的数据作为DomainExists()方法的参数.是否有可能或者我必须找到绕FV的方法才能实现这一目标?

    public QuoteValidator()
    {
    // hardcoded because don't know how to pass input string to RuleFor
        var inputeddomain = "http://google.com";

        RuleFor(r => r.Domain).NotEqual(DomainExists(inputeddomain));
    }

    // checks if inputeddomain is in repository (SQL DB)
    private string DomainExists(string inputeddomain)
    {
        var context = new QuoteDBContext().Quotes;
        var output = (from v in context
                     where v.Domain == inputeddomain
                     select v.Domain).FirstOrDefault();

        if (output != null) { return output; } else { return "Not found"; }
    }
Run Code Online (Sandbox Code Playgroud)

感谢@ bpruitt-goddard暗示,我得到了它的工作.这是我的问题的解决方案(希望它会帮助某人).

        public QuoteValidator()
    {
        RuleFor(r => r.Domain).Must(DomainExists).WithMessage("{PropertyValue} …
Run Code Online (Sandbox Code Playgroud)

c# validation fluentvalidation

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

Fluent Validation - 潜在空值的条件验证

我有许多表单字段,例如电话号码和邮政编码,可以留空。但是,当它们被填写时,我希望它们符合严格的格式规则。

我希望使用 Fluent Validation 来完成这项任务,但我还没有找到任何可以执行以下操作的方法:

RuleFor(x => x.PhoneNumber)
  .Matches(@"^\d{3}-\d{3}-\d{4}$")
  .When(x => x.PhoneNumber.Length != 0)
  .WithMessage("Phone number must be a valid 10-digit phone number with dashes, in the form of &#8220;123-456-7890&#8221;")
  .Length(12, 12).When(x => x.PhoneNumber.Length >= 1).WithMessage("Phone number must be in the form of &#8220;123-456-7890&#8221;");
Run Code Online (Sandbox Code Playgroud)

现在这两个都会抛出“未将对象引用设置为对象的实例”。错误。

我是否有任何意义,或者 FluentValidation 甚至不可能做到这一点?

asp.net-mvc fluentvalidation fluentvalidation-2.0 asp.net-mvc-5

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

FluentValidation:仅验证已更改的属性

我只想验证模型上已更改的属性,不幸的是,默认情况下,流畅的验证似乎会在调用 Validator.Validate(instanceToValidate) 时验证具有规则的每个属性

我尝试将 PropertyChain 设置为仅包含我想要验证的属性并构造一个新的 ValidationContext - 它仍然验证所有规则。

有没有办法使用流畅的验证来实现这一点?

谢谢

c# fluentvalidation

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

Fluent Validation,对Asp.NET Core中列表中的每一项进行不同的验证

我一直试图找到一种方法来验证列表中的项目,每个项目都有不同的验证规则。我遇到了 Fluent 验证,这是一个很棒的库,但我似乎无法找到一种方法来单独对每个项目进行验证。我从这个类似的线程中得到了一个模糊的想法(使用 fluent 验证验证 2 列表),但我不确定如何按照我想要的方式关注它。

所以我有这个视图模型:

 public class EditPersonalInfoViewModel
{
    public IList<Property> UserPropertyList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这包含 Active Directory 属性的列表。每个由这个类表示:

   public class Property
{
    public string Name { get; set; }
    public UserProperties Value { get; set; }
    public string input { get; set; }
    public bool Unmodifiable  { get; set; }
    public string Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

关键是,每个 AD 属性都有不同的约束,所以我想以某种方式为列表中的每个属性指定不同的规则,如下所示:

   public class ADPropertiesValidator : AbstractValidator<EditPersonalInfoViewModel>
{
    public ADPropertiesValidator()
    {
        RuleFor(p => …
Run Code Online (Sandbox Code Playgroud)

c# asp.net validation asp.net-mvc fluentvalidation

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

如何在FluentValidation中从多个程序集中注册验证器?

我在多个程序集中包含FluentValidators。在FluentValidation的早期版本中,我可以这样注册:

services.AddMvc()
  .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<ClassInAssemblyOne>())
  .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<ClassInAssemblyTwo>());
Run Code Online (Sandbox Code Playgroud)

但是,这现在导致以下错误:

Exception thrown: 'System.InvalidOperationException' in System.Linq.dll
An exception of type 'System.InvalidOperationException' occurred in System.Linq.dll but was not handled in user code
Sequence contains more than one matching element
Run Code Online (Sandbox Code Playgroud)

不再允许了吗?如果没有,执行此操作的正确方法是什么?

fluentvalidation

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

Fluent Validation 链式规则不适用于多个 When 条件

我有一个非常有趣的行为。我有以下两个测试用例:

[Fact]
public void Ctor_WhenNeverIsTrueAndAfterOcurrenceIsNotNull_HasError()
{
    // arrange
    var reccurenceEnd = new RecurrenceEnd()
    {
         IsNever = true,
         AfterOccurence = 1
     };

     // act
     var validator = GetValidator();

     // assert
     validator.ShouldHaveValidationErrorFor(p => p.AfterOccurence, reccurenceEnd);
}

[Fact]
public void Ctor_WhenNeverIsFalseAndAfterOccurenceIsNullAndByDateIsNull_HasError()
{
    // arrange
    var reccurenceEnd = new RecurrenceEnd()
    {
        IsNever = false,
        AfterOccurence = null,
        ByDate = null
    };

    // act
    var validator = GetValidator();

    // assert
    validator.ShouldHaveValidationErrorFor(p => p.AfterOccurence, reccurenceEnd);
}
Run Code Online (Sandbox Code Playgroud)

在我的验证器上,如果我有以下内容,第一个测试失败,第二个通过。如果我改变规则的顺序,第一个测试通过,第二个失败。

RuleFor(dto => dto.AfterOccurence)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .Null()
        .When(p => p.IsNever == …
Run Code Online (Sandbox Code Playgroud)

c# xunit fluentvalidation

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

FluentValidation 能否识别调用了哪些方法(PUT 或 POST)?

在 中ASP.NET Core 3.0 Web API,我对和方法使用相同的DTO。在创建新名称时,我想防止已经存在的名称。像这样:PostPutItem

    public ItemValidator(IItemRepository itemRepository)
    {
        RuleFor(input => input.Name).NotEmpty();
        RuleFor(input => input.Name).Must(name => !itemRepository.ItemExists(name))
            .WithMessage(input => $"Item '{input.Name}' already exists");
    }
Run Code Online (Sandbox Code Playgroud)

这一切都非常适合更新和插入。您不能将名称更新为已存在的名称。但!当您尝试将“ItemA”更改为“ItemA”(新名称与旧名称相同)时,您会收到该错误,并且可能会有点误导(尽管在技术上是正确的)。

dto本身中,我没有唯一id的项目。因为我id在路上经过。

如果我可以访问已调用的控制器方法及其参数(包括id),我将能够判断是否有人试图将项目名称更改为相同名称。

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

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