0

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

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

我通过对电子邮件属性进行获取/设置来做到这一点

    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结尾,它就会被添加。现在的问题是这不会发生在客户端,因此验证会显示电子邮件格式不正确的错误。

我尝试从电子邮件中删除获取功能,并添加了一个我确实验证过的属性 FormatedEmail。由于 FormatedEmail 不在表单客户端上工作正常,但是当它不验证时,我无法将错误挂接到电子邮件字段,就像摘要错误一样

我看到多个解决方案

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

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

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

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

2 回答 2

0

就我个人而言,我发现 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"));
    }

}
于 2013-04-04T14:53:21.307 回答
0

我采用的解决方案是采用 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 使用此正则表达式 ( http://regexlib.com/REDetails.aspx?regexp_id=1448 ) 处理电子邮件,因此我创建了一个帮助程序进行验证。

我仍然无法将消息设置到电子邮件字段,但它显示在摘要中。

于 2013-04-05T09:49:41.053 回答