asp.net - page - events asp net
¿Hay un evento después de Page_Load en ASP.net (2)
¿Hay Page_Load
evento que se Page_Load
después de que se hayan completado todos los eventos de Page_Load
?
¿Cómo puedo tener más de una
Page_Load
?
Cuando tienes controles de usuario
Antes de que se pueda procesar mi página, necesito que mi página (y todos los controles incrustados) se hayan inicializado completando sus eventos Page_Load
.
El problema, por supuesto, es que si pongo el código en el controlador Page_Load
mi página:
MyPage.aspx
--> Page_Load
---> DoSomethingWithUserControl()
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
entonces comienzo a acceder a mi control UserControl1
antes de que esté listo.
Necesito una forma de ejecutar el código después de que se hayan disparado todos los eventos de Page_Load
, pero antes de que se hayan disparado los eventos de devolución de datos (por ejemplo, los eventos de Click):
MyPage.aspx
--> Page_Load
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
MyPage.aspx
--> Page_AfterLoad
---> DoSomethingWithUserControl()
Si observamos el ciclo de vida de la página en MSDN, parece que no hay forma de generar un evento después de que se hayan completado todas las cargas de página:
¿Hay alguna manera de generar un after después de que se hayan completado Page_Loads?
Parece que realmente no hay forma de lograr que el código se ejecute confiablemente entre el momento en que se cargan todos los controles (declarados estáticos, consulte los comentarios de Jupaols sobre los agregados dinámicamente) y el momento en que se generan los eventos de devolución de datos.
Incluso fui tan lejos como para desmontar la clase Page utilizando el reflector y, por lo que pude ver, la página no está llamando a ningún método que pueda utilizar entre estos momentos.
Entonces, para el caso general, parece que no tienes suerte.
Pero tu declaración
entonces comienzo a acceder a mi control UserControl1 antes de que esté listo
es cuestionable En el momento en que se Page_Load
método Page_Load
, el estado viewstate y el control se han establecido en todos los controles (al menos los declarados estáticamente). Entonces, a menos que tenga más inicialización de estado en el método OnLoad de un control, el control está listo para ser modificado. Si SÍ tiene algo en juego en OnLoad, entonces ¿por qué no hacer los ajustes allí?
Page_LoadComplete
es el evento que se Page_LoadComplete
después de que se hayan cargado todos los controles
Recuerde que el evento Init
se desencadena por primera vez por todos los controles secundarios, y justo cuando se han inicializado todos los controles, se Init
evento Init
de la página. El evento Load
funciona al revés, la página primero genera el evento Load
y luego cada control secundario genera su propio evento Load
. Al final, se LoadComplete
el LoadComplete
. Tenga en cuenta que esto es cierto solo cuando los controles se crean en el momento del diseño , cuando los controles se crean dinámicamente (lamentablemente) no siguen estrictamente este enfoque.
Desde MSDN:
Si los controles se crean dinámicamente en tiempo de ejecución o declarativamente dentro de plantillas de controles enlazados a datos, sus eventos inicialmente no se sincronizan con los de otros controles en la página. Por ejemplo, para un control que se agrega en tiempo de ejecución, los eventos Init y Load pueden ocurrir mucho más tarde en el ciclo de vida de la página que los mismos eventos para los controles creados de manera declarativa. Por lo tanto, desde el momento en que se crean las instancias, los controles y controles agregados dinámicamente en las plantillas aumentan sus eventos uno tras otro hasta que alcanzan el evento durante el cual se agregaron a la colección de controles.
Echar un vistazo:
(fuente: http://msdn.microsoft.com/en-us/library/ms178472.aspx )
Editar 1
Para cumplir todos sus requisitos:
Necesito una forma de ejecutar el código después de que se hayan disparado todos los eventos de Page_Load, pero antes de que se hayan disparado los eventos de devolución de datos (por ejemplo, los eventos de Click):
Creo que la manera más fácil es declarar un evento personalizado en el Control de usuario y dispararlo después de que se haya cargado el control, entonces jus suscribirse a ese evento en su ASPX
Control de usuario
public event Action LoadCompleted = delegate { };
protected void Page_Load(object sender, EventArgs e)
{
this.LoadCompleted();
}
Página ASPX
protected void Page_Load(object sender, EventArgs e)
{
this.myUserControl.LoadCompleted += () =>
{
// do somethign interesting
this.lblMessage.Text = DateTime.Now.ToString();
};
}