Javascript 具有客户端验证的自定义数据批注验证属性
我制作了一个自定义数据批注属性,用于验证我的数据库中是否已存在电子邮件,如下所示:Javascript 具有客户端验证的自定义数据批注验证属性,javascript,jquery,asp.net,asp.net-mvc,validation,Javascript,Jquery,Asp.net,Asp.net Mvc,Validation,我制作了一个自定义数据批注属性,用于验证我的数据库中是否已存在电子邮件,如下所示: public class ValidateEmail : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { using (var ctx = new myCt
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; }
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;
}
}
}
这在页面重新加载时非常有效…但我现在想更改它,以便在不重新加载页面本身的情况下启用客户端验证和消息显示
如何修改此验证属性,使其与.NETMVC中jquery的非结构化验证兼容
基于@Sayan的链接,我实现了如下内容:
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; }
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;
}
}
}
但无论我现在在“电子邮件”字段中以电子邮件的形式插入什么:
myemail@ymail.xyz
我得到电子邮件存在的错误?您可以在ValidateEmail
validation属性中实现,以向客户端提供data val xxx
属性
然后,您可以编写jQuery unobtrusive validator和adapter,使用HTML中呈现的datavalxxx
验证客户端的字段值
确保根据字段值是否有效,分别从jQuery验证器返回true
(truthy值)或false
(falsy值)
最后,将此自定义jQuery验证程序脚本包含到视图中
你可以找到更多的细节。虽然这篇博文呈现了一个稍微复杂的场景,但是了解如何使用iclientvalidable
以及如何编写jQuery非干扰性验证程序就足够了
希望这是有帮助的 有人吗如果要调用服务器方法,请使用
[Remote]
属性。不要将数据库调用放入ValidationAttribute
Hey Sayan非常感谢您的回复。。我已经“部分”实现了它,但它总是显示电子邮件存在的错误消息。。。我将用我写的解决方案编辑我的初始问题,你能看一下吗?我觉得我只是缺少了完成这个难题的一些细节。。但我只是没看到而已xD@User987请检查我的最新答案。确保根据字段值是否有效分别从jQuery验证器返回true(truthy值)或falsy(falsy值)。嘿,但是IsValid字段返回的是验证结果,而不是布尔类型?好的,明白了,现在接受你的答案,thansk!:)