Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有客户端验证的自定义数据批注验证属性_Javascript_Jquery_Asp.net_Asp.net Mvc_Validation - Fatal编程技术网

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!:)