JQuery和JQuery.Validate“无法获取未定义或空引用的属性'调用'错误

时间:2015-07-22 14:48:25

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

我有一个使用JQuery v1.10.2和JQuery.Validate v1.13.1的ASP.NET MVC 5应用程序,当我通过点击“提交”验证表单或验证输入时,我在Chrome中收到以下错误失去焦点后:

enter image description here

并且Internet Explorer也给了我同样的错误。

我正在使用捆绑系统将不同的脚本捆绑在一起,这是在另一个项目中维护的(在应用程序之间共享,使代码可以在一个地方维护)。我的捆绑包看起来像这样:

BundleTable.Bundles.Add(new ScriptBundle(BundleNames.JavaScript.JQuery).Include(
                    string.Format("~/{0}/jquery-1.10.2.js",_JavaScriptFolder""),
                    string.Format("~/{0}/jquery-1.10.2.min.js",_JavaScriptFolder),
                    string.Format("~/{0}/jquery-migrate-1.2.1.js",_JavaScriptFolder),
                    string.Format("~/{0}/jquery-migrate-1.2.1.min.js",_JavaScriptFolder)));

BundleTable.Bundles.Add(new ScriptBundle(BundleNames.JavaScript.JQueryValidation).Include(
                string.Format("~/{0}/jquery.validate.js",_JavaScriptFolder),
                string.Format("~/{0}/jquery.validate.min.js",_JavaScriptFolder),
                string.Format("~/{0}/jquery.validate.unobtrusive.js",_JavaScriptFolder),
                string.Format("~/{0}/jquery.validate.unobtrusive.min.js",_JavaScriptFolder),
                string.Format("~/{0}/jquery.validate-vsdoc.js", _JavaScriptFolder)));

它们被包含在应用程序布局视图中,如下所示:

    @Scripts.Render(Ebi.Mvc.Library.Bundling.BundleNames.JavaScript.JQuery)    
    @Scripts.Render(Ebi.Mvc.Library.Bundling.BundleNames.JavaScript.JQueryValidation)

当使用JQuery v1.9.1和JQuery.Validate v1.10.0但是我不得不更新JQuery.Validate并且我还决定更新JQuery(我因为IE兼容性原因而避免使用2.X)时,此设置工作正常),但从那以后我一直坚持这个错误。我甚至尝试过改回原来正常工作的版本,但奇怪的是错误仍然存​​在。

我查看了this question (which seems practically identical)的答案,并使用NuGet包管理器安装了JQuery Migrate插件,并将其添加到JQuery包中,但似乎所做的只是停止错误被抛出作为包含加载的表单的页面。

我还要补充一点,在抛出错误之后,验证仍然在表单上进行(例如,将验证类添加到输入并显示输入错误)。

任何人都可以帮我弄清楚导致此错误的原因是什么?

3 个答案:

答案 0 :(得分:1)

在我的场景中,事实证明Sparky所说的使用相同脚本的缩小版和非微型版实际上导致了这个问题。

要解决这个问题,我将我的软件包拆分为minifed和unminized版本,如果需要,这两种类型都可以在我的应用程序中使用。

BundleTable.Bundles.Add(new ScriptBundle(BundleNames.JavaScript.JQuery).Include(
                        string.Format("~/{0}/jquery-1.9.1.js",_JavaScriptFolder)));

BundleTable.Bundles.Add(new ScriptBundle(BundleNames.JavaScript.JQueryMin).Include(
                        string.Format("~/{0}/jquery-1.9.1.min.js", _JavaScriptFolder)));

BundleTable.Bundles.Add(new ScriptBundle(BundleNames.JavaScript.JQueryValidation).Include(
                        string.Format("~/{0}/jquery.validate.js",_JavaScriptFolder),
                        string.Format("~/{0}/jquery.validate.unobtrusive.js",_JavaScriptFolder)));

BundleTable.Bundles.Add(new ScriptBundle(BundleNames.JavaScript.JQueryValidationMin).Include(
                        string.Format("~/{0}/jquery.validate.min.js",_JavaScriptFolder),
                        string.Format("~/{0}/jquery.validate.unobtrusive.min.js", _JavaScriptFolder)));

由于这样做,我能够更新JQuery.Validate插件而不会发生错误。我甚至不必在最后使用JQuery Migrate插件。

所以我想如果其他人得到这个错误,那么值得检查你是不是引用了JQuery和JQuery Validate脚本的缩小和非缩小版本。

我仍然没有答案的一半令人困惑的是,捆绑(在我的问题描述中编码)设置了一年以上,没有发生任何错误,多个应用程序已经使用它,直到我尝试更新插件...

答案 1 :(得分:1)

精确度应该添加到这些解决方案中,因为它们不适用于MVC4。我面对这种情况并且没有成功地尝试了这些答案。当我使用Nuget添加这些jquery-migrate文件并直接在html页面中添加这些文件的引用或者在BundleConfig中添加了jquery bundle而没有任何成功。经过几个小时的尝试,我终于明白,最好在给定页面或给定布局的头部使用捆绑,而不是使用html文档中已知文件的引用。我刚刚将样式和javascript文件的链接更改为类似下面的代码,它们已经生成了页面所需的链接。

   @Scripts.Render("~/bundles/jquery")
  @Scripts.Render("~/bundles/jqueryui")
   <script type="text/javascript" src="~/Scripts/jquery.validate-vsdoc.js"></script>
   @Scripts.Render("~/bundles/jqueryval") 

通过这样做,我获得了成功,不再有这个错误。

如果未在上述jqueryval中添加,则无法执行验证

答案 2 :(得分:0)

由于我没有使用以下参考,因此通过添加:

解决了这个问题
<script type="text/javascript" src="jquery-migrate-1.2.1.min.js"></script>