【发布时间】:2016-06-24 10:15:38
【问题描述】:
我在我的 MVC 5 应用程序中遇到了这种奇怪的行为。
我有一个带有几个 Ajax.ActionLinks 的视图,它们在点击事件时加载相应的部分视图。
@Ajax.ActionLink("Some text here", "_ActionName", "ControllerName", new { param = Model.Id }, ajaxOptions: new AjaxOptions { UpdateTargetId = "partialViewContainer", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, htmlAttributes: new { @id = "btn" })
这成功加载了 _ActionName(int param) 在 ControllerName 中返回的部分视图。但是,在 Chrome 的控制台中,它会抛出异常 Uncaught Error: Syntax error, unrecognized expression: /ControllerName/_ActionName?param=12
所以问题在于/ControllerName/_ActionName?param=12 表达式...
IE(所有版本)会抛出相同的异常,但会出现在恼人的弹出窗口中。
Visual Studio 被配置为中断所有 JavaScript 错误,所以我猜它是预期的.. 但我不明白为什么 jQuery 会抛出这个异常......它不喜欢 Razor 引擎生成的表达式。一些帖子建议降级到 1.x jQuery 版本,但这并没有帮助。
我有其他 MVC 应用程序采用类似的方法通过 Ajax 加载部分视图。ActionLinks 以前从未遇到过这个问题...
其他信息:
我正在使用 Visual Studio 2015 Pro
项目中使用的库:
- jquery-2.2.1
- 引导程序 3.6
- jquery.unobtrusive-ajax
如果还有什么我可以提供更好的理解,请告诉我。提前致谢!
编辑:
我尝试降级到 jQuery 1.7.2,但不再出现异常。 这是因为..
在 1.9 之前,如果字符串中的任何位置都有 HTML 标记,则字符串将被视为 HTML 字符串。这有可能导致无意中执行代码并拒绝有效的选择器字符串。从 1.9 开始,只有以小于 (" 文字字符串的简单使用 例如
$("<p>Testing</p>").appendTo("body")不受此更改的影响。
底线:传递给 jQuery() 的 HTML 字符串以小于号以外的字符开头将被解释为选择器。由于字符串通常不能被解释为选择器,因此最有可能的结果将是 Sizzle 选择器引擎抛出的“无效选择器语法”错误。使用 jQuery.parseHTML() 解析任意 HTML。
我不确定如何解析 Razor 引擎使用 parseHTML() 生成的 Ajax.ActionLink href 链接。另外我想继续使用 jQuery 2.x,因为 Bootstrap.js 3.6 与 1.9 以下的 jQuery 版本不兼容...
【问题讨论】:
-
你为什么不直接使用纯 jQuery 来进行 ajax 调用。相反,您正在使用抽象来生成此调用。做类似 $.post('controller/action',{id:id}, function(data){});
-
我可以这样做,但它太笨拙了......我不明白的是我以前用过类似的方法,从来没有处理过这种情况......
-
@FilixMogilevsky 最终按照您的建议行事......我个人不喜欢这种方法,但它确实有效。感谢您抽出宝贵时间发表评论! :) 干杯
-
很高兴它有所帮助。 :)
标签: jquery .net ajax model-view-controller actionlink