我在我的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 1.7.2并且我不再获得异常。 这是因为......
在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版本......
答案 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);
});
});