validation - .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));
- 是
When()
要使用的功能吗?还是我应该使用Unless()
? - 即使两个字段都不为空,是否也会应用规则?
谢谢你的帮助。
解决方案
我认为您可以像这样更改规则以使其更具可读性:
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));
推荐阅读
- javascript - React JS 错误 - 期待“CALC”,............“dimension”,“number”,输入意外结束 CompileError:开始于 CSS 选择器未定义
- sql - 按 SQL 中新创建的列分组
- python - 从用户定义的函数返回字典而不是元组的替代方法
- r - VerbatimTextOutput() 隐藏时可防止其余主体对象显示在闪亮的应用程序中
- python - 当所有表达式都在 regex101.com 上工作时,Python 正则表达式不工作,当试图打开 8 " W -> 8"W 和 8 "otherword -> 8" otherword
- python - cv2 帧到视频字节数据,用于流光 st.video
- iis - 查看 IIS 日志中的 SQL 语句/查询参数?
- selenium - 没有 Selenium 的 Whatsapp 消息请求
- google-sheets - 从 Google 表格上的每 8 个单元格中复制一个公式
- hadoop - Hadoop 发布具有不可用名称的指标