如何强制在AbstractValidator中使用IRuleBuilder作为'if'语句?

时间:2013-03-15 09:55:50

标签: c# fluentvalidation

这是我的代码:

RuleFor(x => x.Content).NotEmpty().Must(content => content.Trim().Length > 0);

我希望它应该表现为

if (NotEmpty(x.Content) && x.Content.Trim().Length > 0)

语句但如果NullReferenceExceptionx.Content则会引发null

请帮我解决一下。

3 个答案:

答案 0 :(得分:2)

Unless允许您根据条件执行规则。但是,您需要将规则拆分为两个:

RuleFor(x => x.Content).NotEmpty();
RuleFor(x => x.Content).Must(content => content.Trim().Length > 0).Unless(x => x == null);

或者你可以使用??运算符,它更紧凑:

RuleFor(x => (x.Content ?? "").Trim()).NotEmpty();

答案 1 :(得分:2)

看起来这段代码也很完美:

RuleFor(x => x.Content)   
    .Cascade(CascadeMode.StopOnFirstFailure)    
        .NotEmpty()   
        .Must(content => content.Trim().Length > 0);

答案 2 :(得分:1)

你可以写一个custom rule。如果规则返回true,则创建ValidationFailure。像这样:

public class ViewModelValidator : AbstractValidator<ViewModel>
{
    public ViewModelValidator()
    {
        Custom(r => ContentIsEmpty(r) ? new ValidationFailure("Content", "Content must not be empty.") : null);
    }

    private static bool ContentIsEmpty(ViewModel viewModel)
    {
        return string.IsNullOrWhiteSpace(viewModel.Content);
    }
}