1

在 _Layout.cshtml 中:

@RenderBody()
@Scripts.Render("~/scripts/jquery.unobtrusive-ajax.js")

运行脚本会激活 index.cshtml 中的所有 @Ajax.ActionLink。一些 ajax 动作链接通过 ajax 加载局部视图,而这些局部视图包含更多的 ajax 动作链接。这些新的 ajax 操作链接没有被激活,因为 jquery.unobtrusive-ajax.js 在它们出现在页面之前就已经运行了。

我的解决方案是在局部视图上再次运行脚本。

在 _PartialView.cshtml 中:

@Scripts.Render("~/scripts/jquery.unobtrusive-ajax.js")

然而,这会导致 index.cshtml 中的 @Ajax.ActionLink 被第二次激活。如果我点击这些 ajax 动作链接中的任何一个,它们对应的动作就会运行两次。

如何在部分视图中激活新的 ajax 操作链接而不重新激活现有的 ajax 操作链接?

4

1 回答 1

4

除非您使用的是jquery.unobtrusive-ajax.js脚本的某些非常旧的版本,否则您所描述的情况不应如此。之所以不应该是这种情况,是因为jquery.unobtrusive-ajax.jsASP.NET MVC 4 附带的 jQuery.delegate或在最新版本中.on()使用订阅元素click事件的函数。Ajax.*这意味着即使对于最初不存在于 DOM 中但稍后使用 AJAX 调用加载的元素也会执行点击处理程序。

在最新版本中,它使用以下.on方法:

$(document).on("click", "a[data-ajax=true]", function (evt) {
    evt.preventDefault();
    asyncRequest(this, {
        url: this.href,
        type: "GET",
        data: []
    });
});

注意它是如何以活泼的方式订阅 .click 事件到所有具有该data-ajax="true"属性的锚点。即使对于稍后添加到 DOM 的锚点,它也会这样做。

于 2014-03-22T22:17:06.627 回答