代码之家  ›  专栏  ›  技术社区  ›  Buu

如何在ASP.NET MVC 2 RC中编写自定义客户端jquery验证?

  •  12
  • Buu  · 技术社区  · 14 年前

    我读过 Phil Haack's post 在ASP.NET MVC 2中进行自定义客户端验证。我想做同样的事情,但是使用jquery适配器并使用ASP.NET MVC 2 RC(而不是Post使用的MVC 2 Beta)。有人知道怎么做吗?

    我特别想实现密码匹配验证(即密码和确认密码必须匹配)。ASP.NET MVC 2 RC vs.NET项目模板确实演示了如何在服务器端实现该模板(使用 PropertiesMustMatchAttribute )但不是在客户端。

    3 回复  |  直到 12 年前
        1
  •  15
  •   Johnny Oshika    14 年前

    我想你已经听从了菲尔·哈克的指示了 http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx )关于如何使用MS Ajax客户端验证进行自定义验证。要使其与jquery一起工作,需要修改microsoftmvcjqueryvalidation.js文件:

    • 在uuMVC_CreateRulesForField(validationField)函数中,您需要添加一个case语句。继续Phil的例子,您需要添加:

      案例“价格”:

      _ mvc_applyvalidator_price(rulesobj,thisrule.validationParameters[“min”]);

      断裂;

    • 然后您需要创建umvc_applyvalidator_price函数:

    函数\ MVC \应用验证程序\价格(对象,值){

    // min is what jQuery Validate uses to validate for minimum values
    object["min"] = value;
    

    }

    这足以让菲尔的榜样发挥作用。

    现在,关于您的属性mustMatchAttribute验证,它看起来不像MVC为修饰类的属性生成客户端JSON验证定义。由于必须在模型上使用propertiesMustMatchAttribute(而不是属性),所以我无法确定如何使其触发客户端验证。相反,我采取了不同的方法。我创建了一个isvalid()重载始终返回true的虚拟验证属性,并在属性上使用了该属性。这只是一个虚拟属性,它将验证逻辑委托给jquery验证器的equalto函数。下面是虚拟属性:

    public class PropertiesMustMatchClientTriggerAttribute : ValidationAttribute
    {
        public string MatchProperty { get; set; }
    
        public PropertiesMustMatchClientTriggerAttribute(string matchProperty)
        {
            MatchProperty = matchProperty;
            ErrorMessage = "{0} doesn't match {1}.";
        }
        public override bool IsValid(object value)
        {
            return true;
        }
    
        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, MatchProperty);
        }
    }
    

    这是自定义验证器:

    public class PropertiesMustMatchClientTriggerValidator : DataAnnotationsModelValidator<PropertiesMustMatchClientTriggerAttribute>
    {
        private string _message;
        private string _matchProperty;
    
        public PropertiesMustMatchClientTriggerValidator(ModelMetadata metaData, ControllerContext context, PropertiesMustMatchClientTriggerAttribute attribute)
            : base(metaData, context, attribute)
        {
            _message = attribute.FormatErrorMessage(metaData.DisplayName);
            _matchProperty = attribute.MatchProperty;
        }
    
        public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
        {
            var rule = new ModelClientValidationRule
            {
                ErrorMessage = _message,
                ValidationType = "equalTo"
            };
            rule.ValidationParameters.Add("matchField", _matchProperty);
    
            return new[] { rule };
        }
    }
    

    上面的自定义验证器需要在每个phil的blog的application_start()中注册:

    DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(propertiesMustMatchClientTriggerAttribute),typeof(propertiesMustMatchClientTriggerValidator));

    最后,您需要修改microsoftmvcjqueryvalidation.js文件:

    • 将以下case语句添加到uu mvc_createRulesForField:

    “均等”案例:

    _ mvc_applyvalidator_equalto(rulesobj,thisrule.validationParameters[“matchfield”]);

    断裂;

    • 添加此函数:

    函数uu mvc_applyvalidator_equalto(object,elemid){

    object["equalTo"] = document.getElementById(elemId);
    

    }

    现在需要将虚拟验证属性附加到属性:

        [PropertiesMustMatchClientTrigger("Password")]
        public string ConfirmPassword { get; set; }
    

    这应该可以做到。

    创建这个虚拟属性有点难看,所以我希望有人能想出一个更优雅的解决方案。

        2
  •  1
  •   Craig Stuntz    14 年前

    以下是如何添加自定义jquery验证:

    $.validator.addMethod("noSpaces", function(value, element) {
        if ($(element).val().indexOf(" ") >= 0) {
            return false;
        } else {
            return true;
        }
    }, "Value must not contain spaces");
    
        3
  •  0
  •   jamiebarrow    12 年前

    我知道这是一篇旧文章,您使用的是MVC2,但是MVC3现在附带了CompareAttribute,它可以用于密码确认匹配的用例。

    资料来源: http://www.nickriggs.com/posts/asp-net-mvc-3-data-annotations-provide-property-level-contingent-validation/