如何强制AbstractValidator中的IRuleBuilder充当'if'声明

本文关键字:if 声明 充当 何强制 AbstractValidator 中的 IRuleBuilder | 更新日期: 2023-09-27 18:04:16

这是我的代码:

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

我希望它的行为应该是

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

语句,但如果x.Contentnull,则抛出NullReferenceException

如何强制AbstractValidator中的IRuleBuilder充当'if'声明

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();

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

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

您可以编写自定义规则。如果规则返回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);
    }
}