具有客户端验证的自定义数据注释验证属性

时间:2017-07-09 13:56:25

标签: javascript jquery asp.net asp.net-mvc validation

我制作了一个自定义数据注释属性,用于验证我的数据库中是否已存在电子邮件,如下所示:

   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 

我收到电子邮件存在的错误?

1 个答案:

答案 0 :(得分:1)

您可以在ValidateEmail验证属性中实施IClientValidatable,以便向客户端提供data-val-xxx属性。

然后,您可以编写jQuery不显眼的验证器和适配器,以使用HTML中呈现的data-val-xxx验证客户端的字段值。

确保根据字段值是否有效,从jQuery验证器返回true(真值)或false(虚假值)。 < / p>

最后,将此自定义jQuery验证程序脚本包含在您的视图中。

您可以找到更多详情here。虽然这篇博文显示了一个稍微复杂的场景,但是看看如何使用IClientValidatable以及如何编写jQuery不显眼的验证器就足够了。

希望这有帮助。