Jquery + ASP.NET UpdatePanels

时间:2011-05-23 06:45:17

标签: jquery asp.net updatepanel

我一直忙着在我们的自定义CRM工作中实现JQuery。在这个过程中,我创建了一个带边框的面板,它的标题中有一个简单的按钮,根据当前状态,它会折叠或展开内容。现在要记住面板的状态我正在使用jquery cookie库,当提交页面时为该控件设置一个cookie,然后当页面重新加载时,它会读取并重置面板到它的最后状态。

问题一是让JQuery在页面提交时执行,因为ASP.NET接管了这个并且不会在表单上调用submit()函数。为了解决这个问题,我发现http://kenbrowning.blogspot.com/2009/01/supporting-jquerys-formsubmit-in-aspnet.html似乎几乎完美无缺。

但是......经过进一步的测试,我发现这将阻止任何在UpdatePanel中发生的回发,以完成一个完整的Postback,而不是面板中的异步回发。我意识到UpdatePanels现在有点过时,但它们遍布我们的网站,所以为了使用这个控件,它必须与它们很好地协同工作。

那么,无论如何确定是否发生了异步回发?基本上我希望能够做到这样的事情:

if (IsAsyncPostback) {
    theForm.submit(); //this seems to still fire the async postback, but doesn't call the jquery which is setup to save the state..
} else {
    $(theForm).submit(); //this is from the link, which cause all postbacks to be full on postbacks, even if they are in an updatepanel
}

帮助,我已经四处寻找并且找不到任何有用的东西..当然,我不能成为唯一一个尝试过这个的人吗?

2 个答案:

答案 0 :(得分:2)

我会避免干扰__doPostBack()功能。

我认为你想要的是处理PageRequestManager的beginRequestendRequest事件。这将在每次UpdatePanel刷新后运行您的代码,例如:

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_endRequest(function() {
  if ($('#panelID').is(':hidden'))
    $.cookie('#panelID', 'true');
  else
    $.cookie('#panelID', 'false');
});

如果你真的想改变__doPostBack(),最好采用这种方法:

var oldDoPostBack = window.__doPostBack;

window.__doPostBack = function(target, arg) {
  // Trigger a custom event, to track when this occurs.
  $(window).trigger('doPostBack');

  // Call the real __doPostBack() function;
  oldDoPostBack(target, arg);
}

然后,您可以绑定到该自定义事件,以便在从任何来源触发__doPostBack()时执行操作:

$(window).bind('doPostBack', function() {
  alert('__doPostBack is about to execute.');
});

这里的一个重要优势是你没有重新定义__doPostBack(),所以你破坏它的机会就会减少。

我建议坚持使用内置的PageRequestManager事件,除非您确实需要捕获__doPostBack()事件,原因是其他原因。

答案 1 :(得分:0)