2010-09-10 7 views
9

He tenido que implementar algunos cambios en un control de usuario que se usa en un par de páginas. El control de usuario contiene algo de JQuery para manejar una tarea de búsqueda (muestra 3 meses de datos y oculta 9 a la vez). Cuando se carga el control, se mostrará automáticamente el trimestre actual y se ejecuta este código en $ (documento) .Ready().La devolución de datos de Async no causa que el documento esté listo para ejecutarse.

El problema que tengo es que en una de las páginas que se utiliza el control de usuario, el control no está visible en la carga de la página. Una devolución de datos asincrónica se usa para cambiar la visibilidad pero esto no ejecuta listo().

Encontré un fragmento que permite que la página de alojamiento intercepte la respuesta final de la devolución de datos parcial, pero todavía no puedo ejecutar la función dentro del control de usuario.

¿Alguien tiene alguna sugerencia?

Saludos

de Dave

+0

¿Está utilizando UpdatePanels? –

+0

Sí, la página principal contiene una cantidad de paneles de actualización; el panel que contiene este control de usuario también contiene 4 o 5 más. – Dave

+4

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

Respuesta

11

Mientras lo hacía, vas a odiar la respuesta Microsoft prescrito. La respuesta "prescrita" es utilizar el PageRequestManager para configurar un controlador de solicitudes. Este controlador de solicitud se ejecuta (luego) después de que se complete cada devolución parcial.

El controlador de solicitudes Ejemplo:

<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> 

Eso nos lleva a la simple respuesta:
Por qué no inicializar el control del usuario explícitamente de código subyacente y mantener que la inicialización de JavaScript dentro de su usuario controla HTML (sí mismo).

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

    } 
    catch (Exception ex) 
    { 

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

Una vez dictada, la lógica "buildInitializer", dice, "Si existe esta función en el cliente ... llamarlo." Y funciona cada vez.

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(); 
} 

Ahora Tu-inicialización de controles de usuario pueden vivir en la facilidad de control donde debe estar:

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

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

+1 Respuesta muy útil, gracias. Después de implementar su solución, vi ese comentario popular en la pregunta y resolví mi problema con mucho menos código: http://stackoverflow.com/questions/1152946/how-to-have-a-javascript-callback-executed-after- an-update-panel-postback/1153002 # 1153002 – daniloquio

Cuestiones relacionadas