【问题标题】:Validate a single property with the Fluent Validation Library for .Net使用 Fluent Validation Library for .Net 验证单个属性
【发布时间】:2011-02-20 11:16:26
【问题描述】:

您能否使用Fluent Validation 库仅验证单个属性,如果可以,如何验证?我认为this discussion thread from January of 2009 向我展示了如何通过以下语法进行操作:

validator.Validate(new Person(), x => x.Surname);

不幸的是,在当前版本的库中,这似乎不起作用。让我相信验证单个属性可能是可能的另一件事是来自Jeremy Skinners' blog post 的以下引用:

“最后,我添加了能够执行某些 FluentValidation 的属性验证器而无需验证整个对象的功能。这意味着现在可以停止将默认的“需要值”消息添加到 ModelState 。”

但是我不知道这是否一定意味着它只支持验证单个属性,或者您可以告诉验证库在第一个验证错误后停止验证。

【问题讨论】:

  • 从字面上看,这篇文章中的每个链接都不再起作用了:(

标签: .net asp.net asp.net-mvc validation fluentvalidation


【解决方案1】:

根据 CodePlex 上的this discussion,该功能是通过扩展方法添加的。您需要导入 FluentValidation 命名空间才能让它们显示在 IntelliSense 中。

【讨论】:

  • FluentValidation.DefaultValidatorExtensions 具有通过一个或多个属性名称进行验证的扩展方法。即MyClassValidator.Validate(MyClassInstance, "MyPropertyName")
【解决方案2】:

对于遇到此问题的任何其他人。 在 FluentValidation v9.3.0 中,您可以:

_Validator.Validate(ClassInstance, 
                opt=> opt.IncludeProperties(x => x.SomePropertyOfTheClassInstance));

【讨论】:

    【解决方案3】:

    感谢@sebastian.roibu 的回答,我想分享我的解决方案,因为他的回答对我来说是不完整的,希望这可以节省您解决问题的时间。

    我必须先创建一个单独的 CustomValidator: AbstractValidator 类。 这个类有Validate() 方法。

    接下来,Validate() 方法将自己“什么都不做”,您需要查看返回 (ValidationResult),其中包含来自 CustomValidator 的所有错误

    从 ValidationResult 我能够获取该 1 个属性的所有错误,并将其附加到我当前没有以这种方式验证的上下文中。

    这是我关于使用 JsonPatchDocument 验证“PATCH”操作的完整答案:

        public PatchCommandValidator()
        {
            RuleForEach(x => x.JsonPatchDocument.Operations)
                .CustomAsync(HandleOperationValidation);
        }
    
        private async Task HandleOperationValidation(Operation<BasketHeaderPatchModel> property, ValidationContext<PatchBasketHeaderCommand> context, CancellationToken cancellation)
        {
            var requestModel = new RequestModel();
    
            var propertyInfo = requestModel.GetType().GetProperty(property.path.Replace("/", ""));
            propertyInfo.SetValue(basketHeaderPatchModel, Convert.ChangeType(property.value, propertyInfo.PropertyType));
    
            var customValidator = new CustomValidator();
    
            var result = await customValidator.ValidateAsync(requestModel , x => x.IncludeProperties(propertyInfo.Name), cancellation);
    
            result.Errors.ForEach(context.AddFailure);
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      相关资源
      最近更新 更多