Jquery + ASP.NET UpdatePanels - PullRequest
       7

Jquery + ASP.NET UpdatePanels

3 голосов
/ 23 мая 2011

Я активно внедряю JQuery в нашу систему CRM. В процессе я создаю рамочную панель с простой кнопкой в ​​заголовке, которая сворачивает или расширяет содержимое в зависимости от его текущего состояния. Теперь, чтобы вспомнить состояние панели, я использую библиотеку cookie jquery, которая при отправке страницы устанавливает cookie для этого элемента управления, а затем, когда страница перезагружается, она считывает и сбрасывает панель в ее последнее состояние.

Первая проблема заключалась в том, что JQuery выполнялся при отправке страницы, потому что ASP.NET берет на себя это и не вызывает функции submit () в форме. Чтобы преодолеть это, я нашел http://kenbrowning.blogspot.com/2009/01/supporting-jquerys-formsubmit-in-aspnet.html, который, казалось, работал почти безупречно.

Однако ... После дальнейшего тестирования я обнаружил, что это предотвратит любые обратные передачи, которые должны происходить в UpdatePanel, для выполнения полной обратной передачи вместо асинхронной обратной передачи с панели. Я понимаю, что 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 ]

2 голосов
/ 27 мая 2011

Я бы не вмешивался в функцию __doPostBack().

Я думаю, что вам нужно обрабатывать события beginRequest или endRequest PageRequestManager.Это будет запускать ваш код после каждого обновления 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() по какой-то другой причине.

0 голосов
/ 27 мая 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...