Asp.net mvc 4 动态更改jQuery非干扰性验证属性

Asp.net mvc 4 动态更改jQuery非干扰性验证属性,asp.net-mvc-4,jquery-validate,unobtrusive-validation,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,我有一个内置ASP.NET MVC 4的页面,它使用jquery.validate.unobtrusive库进行客户端验证。有一个输入需要在一个数字范围内。但是,此范围可以根据用户与表单其他部分的交互动态更改 默认值验证很好,但是在更新数据规则范围属性后,验证和消息仍会在原始值上触发 以下是初始页面加载时的输入: <input id="amount" data-rule-range="[1,350]" data-msg-range="Please enter an amount betwe

我有一个内置ASP.NET MVC 4的页面,它使用jquery.validate.unobtrusive库进行客户端验证。有一个输入需要在一个数字范围内。但是,此范围可以根据用户与表单其他部分的交互动态更改

默认值验证很好,但是在更新
数据规则范围
属性后,验证和消息仍会在原始值上触发

以下是初始页面加载时的输入:

<input id="amount" data-rule-range="[1,350]" data-msg-range="Please enter an amount between ${0} and ${1}">
此时,如果在输入中输入500,则验证将失败,并显示前面相同的消息,说明它必须介于$1和$350之间。我还尝试从表单中删除验证器和不引人注目的验证,并再次解析它,但没有成功

$('form').removeData('validator');
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");

是否有一种干净的方法可以根据输入属性动态更改验证行为?

您不能通过更改数据属性来动态更改规则。这是因为jQuery验证插件是使用页面加载上现有的
属性初始化的。。。在对属性进行动态更改后,插件无法自动重新初始化

必须使用开发人员提供的
.rules('add')
.rules('remove')
方法


请参阅:

正如Sparky指出的那样,在验证插件初始化后,动态更改默认属性将不会被选中。为了更好地解决这一问题,而不必重新调整注册已验证字段和规则的方式,我发现在不显眼的库中注册自定义适配器最简单:

jQuery.validator.unobtrusive.adapters.add("amount", {}, function (options) {
  options.rules["amount"] = true;
  options.messages["amount"] = function () { return $(options.element).attr('data-val-amount'); };
});

jQuery.validator.addMethod("amount", function (val, el, params) {    
  try {
    var max = $(el).attr('data-amount-max');
    var min = $(el).attr('data-amount-min');
    return val <= max && val >= min;
  } catch (e) {
    console.log("Attribute data-amount-max or data-amount-min missing from input");
    return false;
  }
});
你可以试试这个:

// reset the form's validator
$("form").removeData("validator");

// change the range
$("#amount").attr("data-rule-range", "[1,600]");

// reapply the form's validator
$.validator.unobtrusive.parse(document);

charle的解决方案有效!但是,您不能使用模型属性,我构建的输入如下:

      @Html.TextBoxFor(m => Model.EnterValue, new
           {
               @class = "form-control",
               id="xxxx"
               data_val = "true",
               data_val_range = String.Format(Messages.ValueTooBig, Model.ParamName),
               data_val_range_max = 6,
               data_val_range_min = 2,
               data_val_regex_pattern = "^\\d+(,\\d{1,2})?$"
           })
然后在javascript中:

 $("form").removeData("validator");
        $("#xxxx").attr('data-val-range-max', 3)
        $("#xxxx").attr('data-val-range-min', 0)
        $.validator.unobtrusive.parse(document);

这就是我担心的。我没有通过脚本而不是属性重新连接验证以使用注册规则,而是通过不引人注目的库注册新的自定义适配器来解决问题(请参阅我的答案)。谢谢你的确认!伙计,我知道这已经两年了,但谢谢。把我的头撞在墙上,想把这件事做好。停下来。我通过ajax调用一些密集的服务器端验证来获得验证消息。无法以任何其他方式更改消息。仅供参考,此操作有效,但验证消息从未更新。更正:此操作不正常(例如,错误消息未更新)。最好通过适当的
rules()
方法。
      @Html.TextBoxFor(m => Model.EnterValue, new
           {
               @class = "form-control",
               id="xxxx"
               data_val = "true",
               data_val_range = String.Format(Messages.ValueTooBig, Model.ParamName),
               data_val_range_max = 6,
               data_val_range_min = 2,
               data_val_regex_pattern = "^\\d+(,\\d{1,2})?$"
           })
 $("form").removeData("validator");
        $("#xxxx").attr('data-val-range-max', 3)
        $("#xxxx").attr('data-val-range-min', 0)
        $.validator.unobtrusive.parse(document);