【问题标题】:JavaScript runtime error: Syntax error, unrecognized expression 0x800a139eJavaScript 运行时错误:语法错误,无法识别的表达式 0x800a139e
【发布时间】: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,但不再出现异常。 这是因为..

from the notes

在 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


【解决方案1】:

最终没有使用@Ajax.ActionLink。而是使用@FilixMogilevsky 建议的纯 jQuery Ajax 调用

现在我有

<a href="" data="@Url.Action("_ActionName", "ControllerName", routeValues: new {param = Model.Id})" class="tabLinks">Some text here...</a>
<div id ="divPartialView">
</div>

在脚本块中我使用

$('.tabLinks').on('click', function() {    
    var url = $(this).attr('data');
    $.get(url, function(data) {
        $('#divPartialView').html(data);
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2017-08-13
    相关资源
    最近更新 更多