对格式字段的FluentValidation

本文关键字:FluentValidation 字段 格式 | 更新日期: 2023-09-27 18:07:17

我有一个注册页面,用户通过电子邮件注册。因此,对于模型,我有一个验证规则,声明:

RuleFor(x => x.Email).EmailAddress().WithMessage(localizationService.GetResource("Common.WrongEmail"));

现在的问题是,我有一个需求,声明基于一个设置,我们想要将此限制为具有特定域名的电子邮件。

我只是通过做一个正则表达式验证来做到这一点

RuleFor(x => x.Email).Matches(customerSettings.RestrictLoginPattern).WithMessage(localizationService.GetResource("Customer.Fields.Email.EnteredPasswordWrongFormat"));

因此,如果电子邮件不匹配正则表达式,则显示错误消息。到目前为止一切顺利。

第二个规范是用户应该能够不提交域。所以对于user.name@test.com用户应该可以只写user。name

我通过对email属性

进行get/set来实现这一点
    public string Email { 
        set
        {
            _email = value;
        }
        get
        {
            if (_email == null)
                return null;
            if(!_email.EndsWith(LoginSuffix))
            {
                return string.Format("{0}{1}", _email, LoginSuffix);
            }
            return _email;
        }

所以如果我写的东西不以test.com结尾,它会被添加。现在的问题是,这不会发生在客户端,所以验证显示一个错误,电子邮件格式不佳。

我试图从电子邮件中删除get功能,并添加了一个属性FormatedEmail,我确实验证了。由于FormatedEmail不是在表单客户端工作良好,但当它没有验证时,我不能得到错误到钩子到电子邮件字段,就像一个总结错误

我看到了多个解

我可以禁用该字段的客户端验证。但根据搜索结果,我发现这可能是不可能的?

我可以编写一个自定义的客户端验证,但是对于这样一个"小"问题来说,这感觉太复杂了。

是否有一种方法可以将错误绑定到某个字段?

ModelState.AddModelError("Email", "Error message");

对格式字段的FluentValidation

我个人认为getter/setter中的业务逻辑概念是令人憎恶的。作为一名开发人员,我希望下面的代码总是有效的。

var foo = {something};
var bar = new Bar{ Baz = foo };
Assert.AreEqual(foo, bar.Baz);

在我看来,你所包含的代码是"神奇的"。

我会尝试将不同的验证规则分开。

public class FooValidator : AbstractValidator<Foo>
{
    public FooValidator()
    {
        RuleFor(x => x.Email)
            .Matches(customerSettings.RestrictLoginPattern)
            .WithMessage(localizationService.GetResource("Customer.Fields.Email.EnteredPasswordWrongFormat"))
            //When User is a full email address
            //Make sure its a valid email address
            .When(x => x.Contains('@') || x.EndsWith("@yourdomain.com"));
        RuleFor(x => x.Email)
            .Matches(InternalUsernamePattern)
            .WithMessage("foobaz")
            //Username does not contain @
            //Internal user rules!
            .Unless(x => x.Contains('@')|| x.EndsWith("@yourdomain.com"));
    }
}

我采用的解决方案是采用Arons的技巧并仅为电子邮件创建规则,当我激活后缀设置时,对带有后缀的电子邮件进行手动验证,以确定它是有效的电子邮件。

if (_customerSettings.FixedSuffix && !model.Email.EndsWith(_customerSettings.LoginSuffix))
{
   if (!ValidationHelper.IsEmail(string.Format("{0}{1}", model.Email, _customerSettings.LoginSuffix)))
      ModelState.AddModelError("", string.Format("Not a valid email with suffix {0}", _customerSettings.LoginSuffix));
   else
      model.Email = string.Format("{0}{1}", model.Email, _customerSettings.LoginSuffix);  // add the suffix to the email for user creation 
}

FluedValidation of email使用这个正则表达式(http://regexlib.com/REDetails.aspx?regexp_id=1448),所以我创建了一个助手来验证。

我仍然不能将消息设置为email字段,但它显示在摘要中

相关文章:
  • 没有找到相关文章