首页 > 解决方案 > .NET Core - FluentValidation - 跨字段验证

问题描述

我尝试交叉验证 2 个字段。

html 表单中必须至少提供一个。

RuleFor(x => x.Email).Matches(Tools.EmailValidator).Length(5, 100).When(x => string.IsNullOrEmpty(x.Login));
RuleFor(x => x.Login).Matches(Tools.FreeTextValidator).Length(8, 100).When(x => string.IsNullOrEmpty(x.Email));

谢谢你的帮助。

标签: validationasp.net-corefluentvalidation

解决方案


我认为您可以像这样更改规则以使其更具可读性:

RuleFor(x => x.Email)
.NotNull().NotEmpty()
.WithMessage("Some Message")
.Length(5, 100)
.WithMessage("Some Message") 
.Matches(Tools.EmailValidator)
.WithMessage("Some Message")

此命令效果更好。或者如果您想使用 when ,您可以按照以下方式操作:

When(x => !string.IsNullOrEmpty(x.Email), () => {
  RuleFor(x => x.Email).Matches(Tools.EmailValidator);
  RuleFor(x => x.Email).Length(5, 100);
}).Otherwise(() => {
 RuleFor("some other rules here").Matches("SomeValidator");
});

或者如果您想在第一次失败时停止:

this.CascadeMode = CascadeMode.StopOnFirstFailure;

When(x => string.IsNullOrEmpty(x.Login), () => {
     RuleFor(x => x.Email)
    .Matches(Tools.EmailValidator)
    .Length(5, 100));

When(x => string.IsNullOrEmpty(x.Email), () => {
     RuleFor(x => x.Login)
    .Matches(Tools.FreeTextValidator)
    .Length(8, 100));

推荐阅读