7

您能否使用Fluent Validation Library仅验证单个属性,如果可以,如何验证?我认为2009 年 1 月的这个讨论主题向我展示了如何通过以下语法来做到这一点:

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

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

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

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

4

3 回答 3

5

根据对 CodePlex 的讨论,该功能是通过扩展方法添加的。您需要导入 FluentValidation 命名空间以使它们显示在 IntelliSense 中。

于 2010-05-17T15:25:36.117 回答
4

对于其他偶然发现这个问题的人。在 FluentValidation v9.3.0 中,您可以:

_Validator.Validate(ClassInstance, 
                opt=> opt.IncludeProperties(x => x.SomePropertyOfTheClassInstance));
于 2020-12-02T13:54:21.683 回答
0

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

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

接下来,Validate() 方法将自己“什么都不做”,您需要查看 return ( 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);

    }
于 2021-06-21T17:24:48.517 回答