对格式字段的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");
我个人认为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字段,但它显示在摘要中