JavaScript运行时错误:语法错误,无法识别的表达式0x800a139e

时间:2016-03-09 20:18:50

标签: jquery .net ajax model-view-controller actionlink

我在我的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" })

这会成功加载 _ Controller> _ActionName(int param)返回的部分视图。但是,在Chrome的控制台中,它会抛出异常{{1 }}

问题在于Uncaught Error: Syntax error, unrecognized expression: /ControllerName/_ActionName?param=12表达式......

IE (所有版本)抛出相同的异常但是在恼人的弹出窗口中。

Visual Studio配置为中断所有JavaScript错误,所以我猜它是预期的...但我不明白为什么jQuery会抛出这个异常...它不像Razor生成的表达式发动机。有些帖子建议降级到1.x jQuery版本,但这并没有帮助。

我有其他MVC应用程序通过Ajax加载部分视图的类似方法.ActionLinks之前从未遇到过这个问题......

其他信息:

我正在使用Visual Studio 2015 Pro

项目中使用的库:

  • jquery-2.2.1
  • bootstrap 3.6
  • jquery.unobtrusive-AJAX

如果我能提供更好的理解,请告诉我。在此先感谢!

修改

我尝试降级到jQuery 1.7.2并且我不再获得异常。 这是因为......

from the notes

  

在1.9之前,如果字符串中的任何地方都有HTML标记,则该字符串将被视为HTML字符串。这可能会导致无意中执行代码并拒绝有效的选择器字符串。从1.9开始,如果字符串以小于("<")字符开头,则该字符串仅被视为HTML。 Migrate插件可用于恢复1.9之前的行为。如果已知字符串是HTML但可以以不是HTML标记的任意文本开头,则将其传递给jQuery.parseHTML(),它将返回表示标记的DOM节点数组。可以从中创建jQuery集合,例如:$($。parseHTML(htmlString))。例如,在处理HTML模板时,这将被视为最佳实践   简单使用文字字符串   例如/ControllerName/_ActionName?param=12不受此更改的影响   底线:传递给jQuery()的HTML字符串将以小于字符的内容开头,将被解释为选择器。由于字符串通常不能被解释为选择器,因此最可能的结果将是"无效的选择器语法" Sizzle选择器引擎抛出的错误。使用jQuery.parseHTML()来解析任意HTML。

我不确定如何使用parseHTML()解析Razor引擎生成的Ajax.ActionLink href链接。另外我还想继续使用jQuery 2.x作为Bootstrap.js 3.6并不兼容1.9以下的jQuery版本......

1 个答案:

答案 0 :(得分: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);
    });
});