【问题标题】:jQuery Ajax partial view only working oncejQuery Ajax 局部视图只工作一次
【发布时间】:2013-09-17 02:28:00
【问题描述】:

我有一个 asp.net 页面,它在我当前正在工作的选项卡中返回部分视图。我已经设置了 jQuery,它可以工作。它工作一次,并通过 ajax 返回部分视图.html(result);

但是,这只适用于一次。我单击按钮,它在幕后完成所有应有的操作,它按应有的方式替换了 html。然后,当我再次单击该按钮时,就像这些按钮不再存在 jQuery 一样。没有页面重新加载,这都是通过 ajax 完成的。

第一次加载页面时使用的 HTML 和通过 .html(result) 返回的 HTML 是完全相同的 html 相同的部分视图用于两者。

返回这个局部视图时,我的 jQuery 是否以某种方式断开连接?

这是我的 Ajax 调用:

function updateSort(object) {
    jQuery.ajax({
        url: "/MasterList/UpdateSort",
        type: "get",
        data: object, //if you need to post Model data, use this
        success: function (result) {
            //alert('success');
            //console.log(result);
            jQuery("#procedures").html(result);
        }
    });
}

这里是按钮点击:

jQuery(".btnMoveUp").click(function () {
        var $this = jQuery(this),
            processID = $this.data('processid'),
            currProcedureID = $this.data('procedureid'),
            currSortOrder = $this.data('sortorder'),
            idx = jQuery('.commentlist li').index($this.closest('li')),
            $prevLi = jQuery('.commentlist li').eq(idx - 1),
            $anchor = $prevLi.find('.btnContainer a'),
            prevProcedureID = $anchor.data('procedureid'),
            prevSortOrder = $anchor.data('sortorder');

        // create object that we can pass to MVC controller
        var objProcedure = {};

        objProcedure = {
            _processID: processID,
            _currProcedureID: currProcedureID,
            _currSortOrder: currSortOrder,
            _switchProcedureID: prevProcedureID,
            _switchSortOrder: prevSortOrder
        }

        updateSort(objProcedure);

    });

为什么这只工作一次?

【问题讨论】:

  • 如果绑定了事件处理程序的元素位于被替换的 html 中,那么是的,您将丢失这些绑定。加载新的 html 后重新绑定,或者使用事件委托。
  • 我猜你正在用新元素替换元素,即使标记完全相同,元素也不相同,并且事件处理程序将丢失。您需要的是事件委托。
  • @adeneo 是的,整个 div 正在被部分视图的新结果替换。
  • @Adeneo 我试图将我的 jQuery 更改为使用 .on('click' 但这似乎没有解决任何问题。这是我所缺少的吗?还是我真的必须重新绑定它们我的 Ajax 成功部分?重复代码似乎很多。
  • @adeneo 没关系,我修好了。我只是将我的点击事件扔到一个函数中,在初始加载时调用该函数,然后在我的 .success 回调中调用它。

标签: jquery html ajax asp.net-mvc


【解决方案1】:

我遇到了类似的问题,这是因为响应被缓存了。您可以将缓存的 jQuery ajax 属性设置为 false。

$.ajaxSetup({ cache: false });

【讨论】:

  • 遗憾的是,这并没有解决它,但我确实认为这将解决我在缓存方面遇到的另一个问题。 :)
  • 啊,很高兴我能帮上点忙。
  • 这会起作用,但我相信它会关闭所有 ajax 缓存,而不仅仅是针对此更新进行缓存。您还可以使用 $.ajax({url: "myurl", success: myCallback, cache: false}); 为单个命令关闭缓存,请参阅 stackoverflow.com/questions/7750447/…
【解决方案2】:

在您的操作中使用[OutputCache] 属性来帮助避免缓存。

[OutputCache(Duration = 0)]

【讨论】:

    【解决方案3】:

    您应该使用委托事件处理程序,如下所示:

    $('#procedures').on('click', '.btnMoveUp', function () {
        var $this = jQuery(this),
            processID = $this.data('processid'),
            currProcedureID = $this.data('procedureid'),
            currSortOrder = $this.data('sortorder'),
            idx = jQuery('.commentlist li').index($this.closest('li')),
            $prevLi = jQuery('.commentlist li').eq(idx - 1),
            $anchor = $prevLi.find('.btnContainer a'),
            prevProcedureID = $anchor.data('procedureid'),
            prevSortOrder = $anchor.data('sortorder');
    
        // create object that we can pass to MVC controller
        var objProcedure = {};
    
        objProcedure = {
            _processID: processID,
            _currProcedureID: currProcedureID,
            _currSortOrder: currSortOrder,
            _switchProcedureID: prevProcedureID,
            _switchSortOrder: prevSortOrder
        }
    
        updateSort(objProcedure);
    });
    

    【讨论】:

    • 我把它改成了这个方法,它就像一个魅力。我相信你,但你能解释一下为什么这种方法比函数方法更好,以便我能更好地理解它吗?再次感谢。
    • 这会在页面加载时附加事件处理程序。在每个 ajax 调用上附加相同的事件处理程序可能会导致问题,例如如果由于某种原因没有替换所有元素等,事件处理程序会以某种方式附加两次等。
    • @adeneo 请查看我的问题:stackoverflow.com/questions/23033242/…
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    相关资源
    最近更新 更多