我有一个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以进行验证。实现这一目标的最佳方法是什么?
答案 0 :(得分:29)
还有一个Must
重载,它还为您提供了记录here的FooArgs
对象。它允许您轻松地将两个参数传递到您的方法中,如下所示:
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
将是一个空字符串。这可能会导致验证显示代码的问题。但是,错误属于哪个属性ContryId
或Zip
并不是很清楚,所以这确实有意义。
答案 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);