2010-09-10 2 views
9

Мне пришлось реализовать некоторые изменения в пользовательском элементе управления, который используется на нескольких страницах. Пользовательский элемент управления содержит некоторый JQuery для обработки заданий подкачки (отображает 3 месяца данных и скрывает 9 за раз). Когда элемент управления будет загружен, он автоматически отобразит текущий квартал и выполнит этот код в $ (document) .ready().Async postback не вызывает document.ready для выполнения

Проблема заключается в том, что на одной из страниц используется пользовательский элемент управления, элемент управления не отображается при загрузке страницы. Асинхронный обратный вызов используется для изменения видимости, но это не выполняет готовность().

Я нашел фрагмент, который позволяет странице хостинга перехватывать EndResponse частичной обратной передачи, но я все еще не могу выполнить функцию внутри usercontrol.

Есть ли у кого-нибудь предложения?

Приветствие

Dave

+0

Вы используете UpdatePanels? –

+0

Да, главная страница содержит несколько панелей обновления - панель, содержащая этот элемент управления пользователя, также содержит 4 или 5 других. – Dave

+4

См. Http://stackoverflow.com/questions/1152946/how-to-have-a-javascript-callback-executed-after-an-update-panel-postback/1153002#1153002 –

ответ

11

Как я сделал, вы будете ненавидеть предписанный Microsoft ответ. «Предписанный» ответ заключается в использовании PageRequestManager для настройки обработчика запросов. Этот обработчик запроса (тогда) выполняется после завершения каждой частичной обратной передачи.

Запрос Handler Пример:

<script id="events" type="text/javascript"> 

    jQuery(document).ready(function() { 

     // Your normal code goes here 
     setupSomething(); 
     initializeSomethingElse(); 

     // Setup your partial-postback event handler. 
     // This is used to rewire all events since all are 'lost' after partial-postback. 
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(requestHandler); 
    }); 

    ///<summary>partial postback event handler. Executed after the partial postback is completed. Clears modal popup textboxes</summary> 
    ///<param name="sender"></param> 
    ///<param name="args">http://www.asp.net/ajax/documentation/live/ClientReference/Sys.WebForms/EndRequestEventArgsClass/default.aspx</param> 
    function requestHandler(sender, args) { 

     if (args.get_error() == undefined) { 

      // Your normal code goes here 
      setupSomething(); 
      initializeSomethingElse(); 
     } 
     else 
      alert(args.get_error()); // Do something 
    } 
</script> 

Это приводит нас к простому ответу:
Почему не инициализировать пользовательский контроль явно из кода-позади и держать, что при инициализации JavaScript в ваш пользовательский контроль HTML (сам).

void YourUserControl_PreRender(object sender, EventArgs e) 
{ 
    try 
    { 

    } 
    catch (Exception ex) 
    { 

    } 
    finally 
    { 
     // Do this 
     ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "registerInitializer", buildInitializer(), true); 
    } 
} 

После визуализации, логика «buildInitializer» говорит: «Если эта функция существует на клиенте ... называют это.» И ... он работает каждый раз.

private string buildInitializer() 
{ 
    StringBuilder javascript = new StringBuilder(); 

    javascript.Append("if (window.initializeMyControl) {"); 
    javascript.Append("if(typeof window.initializeMyControl == 'function') { initializeMyControl(); }"); 
    javascript.Append("}"); 

    return javascript.ToString(); 
} 

Теперь пользовательское управление Инициализация может жить в User-Control где он должен быть:

<script type="text/javascript"> 
    function initializeMyControl() { 

     // Your normal code goes here 
     setupSomething(); 
     initializeSomethingElse(); 
    } 
</script> 
+0

+1 Очень полезный ответ, спасибо. После того, как я внедрил ваше решение, я увидел этот популярный комментарий в вопросе и решил мою проблему с гораздо меньшим количеством кода: http://stackoverflow.com/questions/1152946/how-to-have-a-javascript-callback-executed-after- ан-обновление панели-постбэк/1153002 # 1153002 – daniloquio

Смежные вопросы