【问题标题】:client-side validation trips on DataAnnotation Range attributeDataAnnotation Range 属性的客户端验证之旅
【发布时间】:2016-02-24 01:18:14
【问题描述】:

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

    [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 中的错误之外想不出任何东西。

【问题讨论】:

  • 你使用的是哪个 jquery 版本?
  • 问题是关于 jquery not validate check here
  • 看起来这是一个不同的问题;与 jquery 本身无关。介于 jquery-validate 和不显眼的验证之间

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


【解决方案1】:

我们在使用 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] && 值

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

这一行必须是这样的:

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

我已经更改了 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; }

【讨论】:

  • 看起来微软的实际适配器有问题。必须调整适配器以解析数字(在代码中查找 adapters.addMinMax)connect.microsoft.com/VisualStudio/feedback/details/776965/…
  • +1 这种变通方法效果很好。没有它,截至 2013 年 4 月 10 日,即使使用最新的 jQuery 文件,我仍然遇到问题。
  • 以上链接中的 GitHub 问题跟踪器报告了 jQuery Validation V1.11.1(2013 年 3 月 25 日发布)中修复的问题。它现在对我有用。 (我有 Microsoft.jQuery.Unobtrusive.Validation 2.0.30506.0)
【解决方案2】:

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

【讨论】:

  • 我仍然有2.0.30116.0 的问题。我更新了所有内容。
  • @Rowan,您可能想开始一个新线程并提供更多详细信息...我很乐意提供帮助;但我不再遇到 2.0.30116 的问题 - 所以很难进一步排除故障!
【解决方案3】:

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

通过它...

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

【讨论】:

  • 非常感谢!是的,在我将 jquery 升级到 1.9.1 后,我也有一个关于 .live 不再支持的弹出窗口。一旦我添加了 jquery.migrate,弹出窗口就消失了。 然而验证错误仍然存​​在!它可能具有相同的根本原因;但添加 migrate 没有帮助;我在列表中没有找到任何东西 - github.com/jquery/jquery-migrate/blob/master/warnings.md
【解决方案4】:

我最近遇到了这个问题。我从 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);}

【讨论】:

  • 看起来你非常讨厌升级标准包的麻烦。大多数开发人员更不愿意更改标准包,并且无论如何,年前从 MVC 2 升级!
猜你喜欢
  • 2015-03-26
  • 2014-06-15
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 2012-03-06
  • 2014-03-27
相关资源
最近更新 更多