格式字段上的ASP MVC3 FluentValidation

时间:2013-04-04 09:44:18

标签: c# client-side fluentvalidation

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

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

我通过为电子邮件属性

执行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不在表单上,​​clientide工作正常,但是当它无法验证时我无法将错误发送到 hook 到电子邮件字段,就像一个摘要错误

我看到多种解决方案

我可以仅针对该字段禁用客户端验证。但基于搜索,我发现这可能不可能?

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

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

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

2 个答案:

答案 0 :(得分: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"));
    }

}

答案 1 :(得分: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)进行电子邮件,因此我创建了一个帮助程序进行验证。

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