7

我的模型类中有以下代码:

    [Range(1, 100)]
    public decimal Price { get; set; }

在最近将 jquery.validate 升级(我假设)到 1.11.0 之后,即使我输入了有效值,我也会收到错误消息。如果我在 web.config 中关闭客户端验证 - 工作正常。所有其他属性(StringLength,必需)都可以正常工作。生成的 HTML 如下(为清楚起见添加了换行符):

<input class="text-box single-line" data-val="true" 
data-val-number="The field Price must be a number." 
data-val-range="The field Price must be between 1 and 100." 
data-val-range-max="100" data-val-range-min="1" 
data-val-required="The Price field is required." id="Price" name="Price" 
type="text" value="" />

我很确定它以前工作过……除了 jquery.validate 中的错误之外,什么都想不到。

4

4 回答 4

12

我们在使用 jQuery.validate 1.11.0 和 Microsoft.jQuery.Unobtrusive.Validation 2.0.30116.0 时遇到了同样的问题。在验证库更新的某个地方,数字验证器坏了。

GitHub 问题跟踪器上有一个与此问题相关的未解决问题:https ://github.com/jzaefferer/jquery-validation/issues/626

在那个问题中引用:

返回 this.optional(element) || (值 >= 参数 [0] && 值 <= 参数 [1]);

因为这一行检查的是字符串,而不是数字。如果我的范围在 30 到 200 之间,并且我想验证 120,则字符串 120 小于字符串 30。

这一行必须是这样的:

返回 this.optional(element) || ( Number(value) >= Number(param[0]) && Number(value) <= Number(param[1]) );

我已经更改了 jquery.validate.js 的副本:

// http://docs.jquery.com/Plugins/Validation/Methods/range
range: function( value, element, param ) {
    return this.optional(element) || (value >= param[0] && value <= param[1]) || (Number(value) >= Number(param[0]) && Number(value) <= Number(param[1]));
},

现在范围操作使用 DataAnnotations 按预期工作:

[Range(1, 100)]
public decimal Price { get; set; }
于 2013-02-20T20:52:52.057 回答
1

Microsoft 发布了对 microsoft.jQuery.Unobtrusive.Ajax 和 microsoft.jQuery.Unobtrusive.Validation 的更新(从版本“2.0.20710.0”到“2.0.30116.0”),修复.live 和验证问题

于 2013-02-18T23:55:55.773 回答
0

发生这种情况是因为您更新了 Jquery 版本,而新版本的 Jquery 有不同的新更新,并且他们还删除了一些功能,如 .live 并用 .on 替换它

通过它...

http://jquery.com/upgrade-guide/1.9/#live-removed

于 2013-02-15T06:47:56.397 回答
0

我最近遇到了这个。我从 MVC 2 升级到 MVC 5。参数名称似乎从“最小”和“最大”更改为“最小”和“最大”

如果您想解决问题而无需经历升级 JavaScript 文件的麻烦,请在您的解决方案中搜索这两行并将它们替换为更好的行

rule.ValidationParameters['minimum']

用。。。来代替

typeof(rule.ValidationParameters['minimum'])!='undefined'?rule.ValidationParameters['minimum']:rule.ValidationParameters['min']

rule.ValidationParameters['maximum'];

typeof(rule.ValidationParameters['maximum'])!='undefined'?rule.ValidationParameters['maximum']:rule.ValidationParameters['max']

或者,用此代码替换“RangeValidator”函数

Sys.Mvc.RangeValidator.create=function(rule){var $0=typeof(rule.ValidationParameters['minimum'])!='undefined'?rule.ValidationParameters['minimum']:rule.ValidationParameters['min'];var $1=typeof(rule.ValidationParameters['maximum'])!='undefined'?rule.ValidationParameters['maximum']:rule.ValidationParameters['max'];return Function.createDelegate(new Sys.Mvc.RangeValidator($0,$1),new Sys.Mvc.RangeValidator($0,$1).validate);}
于 2016-02-23T17:18:14.273 回答