通过fluent验证进行的电子邮件检查与服务器端不是同一个客户端
本文关键字:服务器端 客户端 同一个 检查 电子邮件 验证 fluent 通过 | 更新日期: 2023-09-27 18:24:24
我使用FluentValidation在客户端和服务器端验证我的模型。我在最新版本的:
Fluent验证.MVC5
在撰写时,即
5.5.0.0
我有以下验证器,简化了:
public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
public MyViewModelValidator()
{
RuleFor(x => x.Email)
.EmailAddress().WithLocalizedMessage(() => MyResources.Validation_Email_NotValidAddress)
.NotEmpty()
.WithLocalizedMessage(() => MyResources.Validation_Email);
}
}
客户端它似乎做了一些基本的验证,例如它不会接受"@"符号两侧没有文本的任何东西,但它会接受类似test@test.
的东西
当我发布这些数据时,问题出现了,我的控制器中有以下内容:
if (!ModelState.IsValid)
throw new Exception("Model validation error");
这会将模型视为由于test@test
电子邮件地址而无效,并引发错误。因此,我的前端验证似乎比服务器端验证更宽松。
在参考了文档后,它确实声明客户端支持Email()
方法,但在服务器端和前端呈现的内容之间似乎存在一些差异。
https://fluentvalidation.codeplex.com/wikipage?title=mvc
如何确保客户端验证与服务器端验证电子邮件一样彻底。
正如Evgeny在上面提到的,我最终选择使用Matches
规则,因为这是客户端支持的验证器之一。
RuleFor(x => x.Email)
.Matches(@"^'w+([-+.']'w+)*@'w+([-.]'w+)*'.'w+([-.]'w+)*$").WithLocalizedMessage(() => MyResources.Validation_Email_NotValidAddress)
.NotEmpty() // <-- and cant be empty
.WithLocalizedMessage(() => MyResources.Validation_Email);
上面的Regex我相信是ASP.NET用于RegularExpressionValidator
的。符合我的要求。
客户端在jquery.validate插件核心中定义的电子邮件输入规则(用数据val电子邮件属性装饰)
服务器端Fluent Validation EmailValidator类(也称为RegExp)中定义的电子邮件属性规则
就生命周期而言,这些项目没有什么共同之处:在任何新版本中,内部regexp在两个项目中都可能同时变得或多或少严格,如果你的目标是在客户端和服务器上使用相同的规则,并使其正确工作,而不考虑插件/库版本更新——我的建议是用Match()
规则替换当前的EmailAddress()
规则,并指定regexp,明确地满足您的领域模型需求。
更新:
选择合适的regexp是另一个主题,这里广泛描述了