RegisterStartupScript в Masterpage.PageLoad() не будет выполняться при асинхронной обратной передаче в ContentPlaceHolder.

После поиска в Интернете по нескольким ключевым словам я не смог найти решение своей проблемы.

Я начал с поиска способа вывести всплывающее сообщение с просьбой возобновить сеанс за минуту до его отмены. Решение, которое я решил использовать, заключалось в том, чтобы запустить таймер javascript на главной странице и вызвать его на Masterpage.Page_Load(). Таким образом, всякий раз, когда мой пользователь переходит со страницы на страницу, он сбрасывает таймер. Однако, поскольку многие из страниц, которые будет использовать пользователь, имеют панели обновлений и обновляются асинхронно, функция, которую я использую, достигается, но пропускается (согласно отладчику).

Функция, которую я использую:

ScriptManager.RegisterStartupScript(main, this.GetType(), "callTimer", "callTimer();", true);

Эта функция отлично работает с обычными обратными передачами или асинхронными обратными передачами на главной странице (я обновляю таймер, выполняя обратную передачу на панели обновлений на главной странице), однако она будет пропущена при асинхронных обратных передачах.

Я пробовал несколько вещей, делая управление функцией Page или UpdatePanel на главной странице или панелью обновления на дочерних страницах. Я также пытался поместить этот код на дочерние страницы, но хотя эти изменения действительно сбрасывают таймер, это приводит к тому, что код javascript запускается несколько раз, и они борются за метку, отображающую обратный отсчет.

Я действительно в недоумении здесь. Я думаю, что возможным решением было бы изменить управление startscript и снова завершить все javascripts, запущенные до этого кода. Однако поиск способа программно завершить, отменить или остановить функции javascript также не дает полезных результатов.

Другим решением, с которым я бы согласился, является сброс таймера движения мыши, но, поскольку я проектирую для IE8, это не будет работать, если окно не находится вне фокуса.


person PeterPurnyn    schedule 14.12.2012    source источник
comment
Я нашел решение проблемы: мне удалось решить эту проблему, отправив текущую дату и время в виде числа функции javascript. оттуда я устанавливаю значение метки обратного отсчета на дату.время. там, во время моего таймера, если я обнаружу, что date.time метки не соответствует той, с которой началась функция, она вернет и завершит функцию. Это означало, что в любой момент времени будет работать только последний экземпляр функции.   -  person PeterPurnyn    schedule 15.12.2012


Ответы (2)


Вам нужно инжектить скрипт через ScriptManager в случае частичной обратной передачи, иначе он не будет перевыполнен. Вот служебная функция (vb.net) для обработки логики внедрения:

Public Shared Sub InjectScript(ByVal containingPage As Page, ByVal scriptKey As String, ByVal scriptText As String)
    Dim sManager = ScriptManager.GetCurrent(containingPage)

    If sManager IsNot Nothing AndAlso sManager.IsInAsyncPostBack Then
        //the page is being partially-posted back by an Ajax control (e.g. UpdatePanel)
         ScriptManager.RegisterStartupScript(containingPage, GetType(Page), scriptKey, scriptText, True)
    Else
        //standard postback
        containingPage.ClientScript.RegisterStartupScript(GetType(Page), scriptKey, scriptText, True)
    End If
End Sub
person jbabey    schedule 14.12.2012
comment
Во-первых, большое спасибо за ответ. Во-вторых, что означает внедрение скрипта через ScriptManager по сравнению с тем, что я делаю? Я все еще конвертирую это в код С#, поэтому я еще не тестировал его, но я хотел бы понять код, который я добавляю, и Google не дал мне ответа. - person PeterPurnyn; 14.12.2012
comment
хорошо, я преобразовал его в C#. Однако это вызывает те же проблемы, которые я описал ранее (при asyncpostback он заставляет javascript запускаться дважды, так что метка таймера мерцает, когда две функции пытаются изменить его одновременно. Ограничение на количество символов не позволяет мне опубликовать код. - person PeterPurnyn; 14.12.2012
comment
так что это не сработало для меня. Это породило те же проблемы. Однако мне удалось решить эту проблему, отправив текущую дату и время в виде числа функции javascript. оттуда я устанавливаю значение метки обратного отсчета на дату.время. там, во время моего таймера, если я обнаружу, что date.time метки не соответствует той, с которой началась функция, она вернет и завершит функцию. Это означало, что в любой момент времени будет работать только последний экземпляр функции. - person PeterPurnyn; 15.12.2012

Я нашел решение проблемы: мне удалось решить эту проблему, отправив текущую дату и время в виде числа функции javascript. оттуда я устанавливаю значение метки обратного отсчета на дату.время. там, во время моего таймера, если я обнаружу, что date.time метки не соответствует той, с которой началась функция, она вернет и завершит функцию. Это означало, что в любой момент времени будет работать только последний экземпляр функции.

person PeterPurnyn    schedule 17.12.2012