多个属性的FluentValidation规则

时间:2013-12-11 20:16:23

标签: fluentvalidation

我有一个FluentValidator,它有多个属性,比如zip和county等。我想创建一个带有两个属性的规则,就像RuleFor构造一样

public class FooArgs
{
    public string Zip { get; set; }
    public System.Guid CountyId { get; set; }
}

public class FooValidator : AbstractValidator<FooArgs>
{
    RuleFor(m => m.CountyId).Must(ValidZipCounty).WithMessage("wrong Zip County");
}

这有效,但我想将Zip和县都传递到rue以进行验证。实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:29)

还有一个Must重载,它还为您提供了记录hereFooArgs对象。它允许您轻松地将两个参数传递到您的方法中,如下所示:

RuleFor(m => m.CountyId).Must((fooArgs, countyId) =>
    ValidZipCounty(fooArgs.Zip, countyId))
    .WithMessage("wrong Zip County");

答案 1 :(得分:13)

刚刚遇到这个老问题,我想我的答案更简单。通过将参数简化为RuleFor,例如

,您可以轻松地将整个对象传递到自定义验证规则中
RuleFor(m => m).Must(fooArgs =>
    ValidZipCounty(fooArgs.Zip, fooArgs.countyId))
    .WithMessage("wrong Zip County");

如果ValidZipCountry方法是验证者的本地方法,您可以将其签名更改为FooArgs,那么代码会简化为

RuleFor(m => m).Must(ValidZipCounty).WithMessage("wrong Zip County");

唯一的缺点是结果验证错误中的PropertyName将是一个空字符串。这可能会导致验证显示代码的问题。但是,错误属于哪个属性ContryIdZip并不是很清楚,所以这确实有意义。

答案 2 :(得分:0)

在我的情况下,如果另一个属性不为空(以下示例中的x.RequiredProperty),我需要标记一个必需属性(以下示例中的x.ParentProperty)。我最终使用了When语法:

RuleFor(x => x.RequiredProperty).NotEmpty().When(x => x.ParentProperty != null);

或者,如果对于公共when子句有多个规则,则可以如下编写:

When(x => x.ParentProperty != null, () =>
{
    RuleFor(x => x.RequiredProperty).NotEmpty();
    RuleFor(x => x.OtherRequiredProperty).NotEmpty();
});

When语法的定义如下:

/// <summary>
/// Defines a condition that applies to several rules
/// </summary>
/// <param name="predicate">The condition that should apply to multiple rules</param>
/// <param name="action">Action that encapsulates the rules.</param>
/// <returns></returns>
public IConditionBuilder When (Func<T, bool> predicate, Action action);