Проблема двойной обратной передачи
Вопрос
У меня есть приложение ASP.NET 1.1, и я пытаюсь выяснить, почему, когда я меняю ComboBox, значение которого используется для заполнения другого (отношения родитель-потомок), создаются две обратные передачи.
Я проверил и проверил код, но не могу найти причину.
Вот оба стека вызовов, которые заканчиваются на page_load.
Первая обратная передача (генерируется автоматической обратной передачей ComboBox)
Стек вызовов обратной передачи http://www.juanformoso.com.ar/images/callstack1.jpg
Вторая обратная передача (это то, что я хочу выяснить, почему это происходит)
альтернативный текст http://www.juanformoso.com.ar/images/callstack2.jpg
Любое предложение?Что я могу проверить?
Решение
Это очень специфическая проблема с этим кодом, я сомневаюсь, что он будет полезен кому-то еще, но вот оно:
К комбо добавлена проверка onchange
с if, если условие было выполнено, был выполнен явный вызов функции обратной передачи.Если для комбинации было установлено значение AutoPostback
, asp.net снова добавил вызов обратной передачи, создав две обратные передачи...
Сгенерированный HTML-код был таким:
[select onchange="javascript: if (CustomFunction()){__doPostBack('name','')}; __doPostBack('name','')"]
Другие советы
Первое, на что я хотел бы обратить внимание, это то, что у вас нет свойства AutoPostBack второго ComboBox, установленного в значение true.Если вы измените значение во второй комбинации, установив для этого свойства значение true, я считаю, что для этого элемента управления будет сгенерирована обратная передача.
Есть ли у вас код, которым вы могли бы поделиться?В свое время двойная обратная связь настолько беспокоила меня в классическом ASP, что именно она в конечном итоге побудила меня раз и навсегда переключиться на .NET.Всякий раз, когда у меня возникают подобные проблемы с .NET, я обращаюсь к каждому элементу CONTROL и каждому элементу PAGE, например load, init, prerender, click, SelectedIndexChanged и тому подобное, и ставлю точку останова.
Даже если у меня там нет кода, я вставлю что-то вроде:
Dim i As Integer
i = 0
Обычно мне удается определить какое-то действие, которого я не ожидал, и при необходимости исправить.Я бы посоветовал вам сделать это здесь.
Удачи.
Проверьте Request.Form["__EVENTTARGET"], чтобы найти элемент управления, инициирующий обратную передачу — это может помочь вам сузить область поиска.
Глядя на стеки вызовов и некоторое отражение (в ASP.NET 2 - у меня нет под рукой 1.1) - похоже, что SessionStateModule.PollLockedSessionCallback является частью процедур запуска HttpApplication.Возможно, ваше приложение перерабатывается — я почти уверен, что для этого событие записывается в журнал событий.
Единственное, что я могу предложить, это Fiddler или что-то в клиенте для захвата HTTP-трафика.
Это очень старый пост, но люди до сих пор ищут в нем решение точно так же, как и я на прошлой неделе.
Как сказал Гренгби, двойные события являются основными причинами, но удаление одного из них не всегда возможно.По крайней мере, в моем случае, и мне пришлось решать эту проблему по заявлению третьей стороны.
Я добавил следующий скрипт и изменил форму ASP на главной странице:
<script>var Q = 0;</script>
<form id="Form1" runat="server" onsubmit="Q++; if(Q==1){return true;} else { return false;}">
Кажется, это работает, пожалуйста, пересылайте свои комментарии.
Арун
http://www.velocityreviews.com/forums/t117900-asp-net-multiple-postback-issue.html