Несколько панелей обновления и несколько обратных ссылок вызывают обновление всей страницы - PullRequest
1 голос
/ 14 апреля 2010

У меня та же проблема, что и у меня вчера ... Решение, предоставленное Аристосом, помогло решить проблему, но у меня есть другие места, отправляющие постбэки панели обновления, вызывающие ту же проблему.

Когда панель обновлений обновляется и вызывается еще один запрос на обновление, прежде чем он сможет отобразить первые обновления, обновляется вся страница, а не только панель обновлений.

Я использовал fiddler , чтобы увидеть, что происходит, и вот что происходит ... Если я жду запроса на возврат, прежде чем выполнить другой запрос, я получаю это:

21443 | UpdatePanel | dnn_ctr1107_CRM_SalesTool_LeadsUpdatePanel |

Но если я не подожду, я получу это:

66 | pageRedirect || http://mysite.com/salesdashboard.aspx|

Код из предыдущего вопроса остался прежним, за исключением того, что я добавил UpdateMode="Conditional" на панель обновления.

Есть идеи? Или это единственное решение этой проблемы, заключающееся в том, что обновления 2+ для любого количества панелей обновлений (если они находятся на одной странице) никогда не происходят?

Спасибо,
Matt

Ответы [ 2 ]

0 голосов
/ 17 февраля 2014

Я могу ошибаться, но если я прав, то вы не можете сделать несколько запросов AJAX, если вы используете asp.net WebForms. В asp.net WebForms на странице есть только один элемент Form. Несколько запросов AJAX на одной странице требуют нескольких элементов формы для каждого. Html предназначен для отправки обратно внутри элемента формы, а механизм, который обрабатывает указанную обратную передачу, - это форма, это контейнер. Только один может отправить сообщение одновременно. Поэтому, поскольку Asp.Net WebForms имеет только один элемент формы на страницу, вы можете сделать только 1 обратную передачу AJAX на страницу.

При желании вы можете создать универсальные обработчики Http ASHX для выполнения логики формы и использовать JQuery Ajax для отправки обратно в универсальные обработчики Http. В этом случае вы можете делать столько раз, сколько хотите.

Обычно я использую обработчик ASHX в любое время, когда мне нужно обслуживать изображения, которые меняются, например, на лету. Я также использую их для больших выходных данных. Например. обработчик ASHX возвращает большой дамп JSON. Я выполняю Ajax Postback для обработчика ASHX, чтобы получить набор данных в JSON и добавить его в таблицу и т. Д., И я неоднократно вызываю обработчик ASHX по таймеру для получения новых данных по мере их поступления (скажем, 5-минутного таймера) и т. Д. .

Если бы вы дали больше информации о том, что вы пытаетесь сделать, я мог бы предоставить вам альтернативные решения.

Редактировать: Я посмотрел ваш другой пост, который вы связали, и я думаю, что обработчик ASHX будет вам полезен. Вы можете создать обработчик ASHX, который будет возвращать ваши данные поиска в формате JSON. Вы можете использовать переменные Request в обработчике ASHX и отправлять данные публикации в обработчик ASHX с помощью JQuery.Ajax.

Вы должны быть в состоянии выполнить несколько запросов, каждый из которых имеет собственную функцию успеха. Затем вам нужно будет написать javascript таким образом, чтобы при обработке данных JSON из обработчика ashx он мог объединиться с другими запросами по завершении.

0 голосов
/ 14 апреля 2010

Может быть, Microsoft AJAX не может обрабатывать 2 запроса одновременно, потому что ему нужно каждый раз знать, что это за сообщение, поэтому, если вы нажмете, когда будете ждать возврата, он узнает, что сообщение имеет изменить, так что он мимоходом Ajax, чтобы быть Soure для правильного возвращения.

Я могу думать 2 способами. Один из способов - сделать это самостоятельно, используя jQuery и ajax, и избегать UpdatePanel.

Второй способ - это блокировать щелчки, когда вы ожидаете возврата, или создать механизм для размещения запроса один за другим.

Этот код может помочь вам узнать, когда вы блокируете ввод и когда вы отпускаете его, или делаете то, что вы думаете.

$(document).ready(function() {
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    prm.add_initializeRequest(InitializeRequest);
    prm.add_endRequest(EndRequest);
});

function InitializeRequest(sender, args) {  
   LastIdCaller = args.get_postBackElement().id;    
}

function EndRequest(sender, args) {
}
...