我制作了一个自定义数据注释属性,用于验证我的数据库中是否已存在电子邮件,如下所示:
public class ValidateEmail : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
using (var ctx = new myCtx())
{
if (value != null)
{
var valueAsString = value.ToString().ToLower();
IEnumerable<string> email = ctx.Users.Where(x => x.Email != null).Select(x => x.Email);
if (email.Contains(valueAsString))
{
var errorMessage = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success;
}
}
}
在我的视图模型中,我将其设置为:
[ValidateEmail(ErrorMessage = "Email exists")]
[Required(ErrorMessage = "Required")]
[RegularExpression(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$", ErrorMessage = "Invalid Email")]
public string Email { get; set; }
当页面重新加载时,这非常有效...但我现在想要更改此设置,以便在不重新加载页面本身的情况下启用客户端验证和消息显示...
如何修改此验证属性以使其与.NET MVC中jquery的不显眼验证兼容?
基于@Sayan的链接,我实现了类似的东西:
public class ValidateEmail : ValidationAttribute, IClientValidatable
{
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
rule.ValidationType = "emailvalidate";
yield return rule;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
using (var ctx = new myContext())
{
if (value != null)
{
var valueAsString = value.ToString().ToLower();
IEnumerable<string> email = ctx.Users.Where(x => x.Email != null).Select(x => x.Email);
if (email.Contains(valueAsString))
{
var errorMessage = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success;
}
}
}
和客户方:
$.validator.addMethod("emailvalidate", function (value, element) {
{
console.log("value: " + value + " " + element);
}});
$.validator.unobtrusive.adapters.add("emailvalidate", function (options) {
//adding rules for validator
options.rules["emailvalidate"] = true;
if (options.message) {
options.messages["emailvalidate"] = options.message;
}
});
但是我现在在电子邮件字段中插入的电子邮件如下:
myemail@ymail.xyz
我收到电子邮件存在的错误?
答案 0 :(得分:1)
您可以在ValidateEmail
验证属性中实施IClientValidatable
,以便向客户端提供data-val-xxx
属性。
然后,您可以编写jQuery不显眼的验证器和适配器,以使用HTML中呈现的data-val-xxx
验证客户端的字段值。
确保根据字段值是否有效,从jQuery验证器返回true
(真值)或false
(虚假值)。 < / p>
最后,将此自定义jQuery验证程序脚本包含在您的视图中。
您可以找到更多详情here。虽然这篇博文显示了一个稍微复杂的场景,但是看看如何使用IClientValidatable
以及如何编写jQuery不显眼的验证器就足够了。
希望这有帮助。