在ajax加载的部分视图中使用@ Ajax.ActionLink上的jquery.unobtrusive-ajax.js

时间:2014-03-22 22:03:34

标签: jquery asp.net-mvc-4 partial-views unobtrusive-ajax

在_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操作链接?

1 个答案:

答案 0 :(得分:4)

除非您使用的是jquery.unobtrusive-ajax.js脚本的一些非常旧版本,否则您所描述的内容并非如此。这不应该是这种情况的原因是因为ASP.NET MVC 4附带的jquery.unobtrusive-ajax.js使用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中的锚点,它也会这样做。