我有一个注册页面,用户通过电子邮件注册。 因此,对于模型,我有一个验证规则:
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");
答案 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)进行电子邮件,因此我创建了一个帮助程序进行验证。
我仍然无法将消息设置为电子邮件字段,但它会显示在摘要中。