首页 > 解决方案 > MVC 3 ASP .NET 客户端验证不起作用

问题描述

我有以下自定义验证:

  public class DateGreaterThanAttribute : ValidationAttribute, IClientValidatable
{

    private string DateToCompareFieldName { get; set; }

    public DateGreaterThanAttribute(string dateToCompareFieldName)
    {
        DateToCompareFieldName = dateToCompareFieldName;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null) return new ValidationResult("Not valid");
        DateTime laterDate = (DateTime)value;

        DateTime earlierDate = (DateTime)validationContext.ObjectType.GetProperty(DateToCompareFieldName).GetValue(validationContext.ObjectInstance, null);

        if (laterDate >= earlierDate)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(string.Format("LOA From must be less than LOA To", DateToCompareFieldName));
        }
    }

    //esse método retorna as validações que serão utilizadas no lado cliente
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var clientValidationRule = new ModelClientValidationRule()
        {
            ErrorMessage = string.Format("LOA From must be less than LOA To", DateToCompareFieldName),
            ValidationType = "dategreaterthan"
        };

        clientValidationRule.ValidationParameters.Add("datetocomparefieldname", DateToCompareFieldName);

        return new[] { clientValidationRule };
    }

}

我有以下领域:

      [DateGreaterThanAttribute("ReferralStart")]
    [MappingField("ReferralEnd", IgnoreIfNull = true)]
    [Required]
    [Display(Name = "LOA Date To")]
    public System.DateTime? ReferralEnd {
        get {
            return this._referralEnd;
        }
        set {
            this._referralEnd = value;
        }
    }

在客户端,我在单独的 customValidations.js 文件中添加了以下内容。

(function ($) {
$.validator.addMethod("dategreaterthan", function (value, element, params) {
    if (!this.optional(element)) {
        var otherProp = $('#' + params)
        return (otherProp.val() != value);
    }
    return true;
});
$.validator.unobtrusive.adapters.addSingleVal("dategreaterthan", "datetocomparefieldname");

}(jQuery));

当我检查 html 时,我可以看到我的注释的 data-val 已添加:

<input autocomplete="off" class="form-control limit-width text-box single-line hasDatepicker" data-val="true" data-val-date="The field LOA Date To must be a date." data-val-dategreaterthan="LOA From must be less than LOA To" data-val-dategreaterthan-datetocomparefieldname="ReferralStart" data-val-required="The LOA Date To field is required." id="ReferralEnd" name="ReferralEnd" type="datetime" value="">

并将其添加到捆绑配置中:

      bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/customValidation.js",
                    "~/Scripts/jquery.validate*"));

但是验证不是在客户端完成的,而是在服务器端运行良好。

我做错了什么?

标签: jqueryasp.netvalidationannotationsclient-side

解决方案


推荐阅读