客户端验证在DataAnnotation Range属性上跳闸

时间:2013-02-15 06:32:56

标签: asp.net-mvc-4 jquery-validate data-annotations unobtrusive-validation

我的Model类中有以下代码:

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

最近升级(我假设)jquery.validate到1.11.0后,即使输入有效值,我也收到错误。如果我在web.config中关闭客户端验证 - 工作正常。所有其他属性(StringLength,Required)工作正常。生成的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 个答案:

答案 0 :(得分: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)|| (值&gt; =参数[0]&amp;&amp; value&lt; = param [1]);

     

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

     

这一行必须是这样的:

     

返回this.optional(element)|| (数字(值)&gt; =数字(param [0])&amp;&amp; Number(value)&lt; = 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; }

答案 1 :(得分:1)

Microsoft发布了microsoft.jQuery.Unobtrusive.Ajax和microsoft.jQuery.Unobtrusive.Validation(从版本'2.0.20710.0'到'2.0.30116.0')的更新,修复了两者。实时和验证问题

答案 2 :(得分:0)

发生这种情况是因为你已经更新了Jquery版本,并且新版本的Jquery有不同的新更新,他们也删除了一些像.live这样的函数并用.on替换它。

通过它...

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

答案 3 :(得分:0)

我最近碰到了这个。我从MVC 2升级到MVC 5.似乎参数名称已从&#34;最小值&#34;和&#34;最大&#34;到&#34; min&#34;和&#34; max&#34;

如果您想在不经历升级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']

或者,替换&#34; RangeValidator&#34;使用此代码的函数

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);}