通过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

如何确保客户端验证与服务器端验证电子邮件一样彻底。

通过fluent验证进行的电子邮件检查与服务器端不是同一个客户端

正如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是另一个主题,这里广泛描述了