2012-04-17 22 views
6

Digamos que tenemos una forma bastante estándar con un cuadro de texto y un botón (por simplicidad). Desea manejar un evento Click y hacer algunas cosas en función de la entrada del usuario.Cuándo conectar los controladores de eventos asp.net

Me preguntaba, ¿qué importancia tiene, cuando exactamente se conecta un controlador de eventos para el evento Click en un código subyacente? Si lo hace, ¿dónde está el mejor lugar para ponerlo? Carga de página ¿Página init? Probé en ambos lugares, pero no noté ninguna diferencia. ¿O solo es una preferencia personal del programador? Ya he buscado en Internet varias veces, pero no he encontrado ninguna respuesta satisfactoria.

Sé cuando se ejecuta el método real, simplemente no estoy seguro acerca de la parte de conexión.

+0

¿Está utilizando cualquier marcos como MVC o se trata de formularios web ASP.Net? –

+3

@JeremyThompson. en MVC no hay código detrás, ¡gracias a Dios! – gdoron

+0

@JeremyThompson, webforms ... :) – walther

Respuesta

15

Como saben, hay varios controladores Page_xxx de eventos, como Init, Load, Prerender ... Este evento existen en los controles, y páginas, así como controles de usuario (de hecho están Control forma, que posee todos derivados estos eventos).

Este evento se relacionan con la ASP.NET Page Life Cycle

Si usted lee la página a la que apunta este enlace con cuidado va a entender cuando se desencadenan los acontecimientos. Por lo tanto, si vincula su controlador de eventos en cualquier evento de ciclo de vida de la página que ocurra antes de que se desencadenen los eventos, se garantiza que los controladores de eventos estarán vinculados a tiempo para que se activen.

Estas son las principales etapas del ciclo de vida:

PreInit -> Init -> InitComplete -> PreLoad -> Load -> [Control events] -> 
LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload 

eventos No todos ellos han asociados, pero, si es necesario, puede anular la función OnXxx() correspondiente, como OnPreInit(). (Esto generalmente solo se realiza en controles de servidor personalizados).

Puede enlazar eventos en Page_Init o Page_Load, debido a que los eventos de control se triggerd después de la carga de todos los controles ha terminado. El paso Load ocurre en la parte superior de la pantalla, primero en la página y luego recursivamente en todos los controles secundarios.

Después de Load acabados, los primeros eventos que se desencadenan son los eventos de cambio, como TextChanged o SelectionChanged. Luego se activan todos los demás eventos, como Click.

Si enlazó los eventos en PreRender o Descargar, no se activaron. Si lo hizo en Init o Load, lo harían.

Así podría parecer que es segura para unirse en Init o de carga, pero eso no es cierto:

Podría parecer que no hay ninguna razón especial para atarlos en Init o Load, porque van a se activará más adelante en el ciclo de vida de la página. Pero, como el enlace definido en .aspx ocurre durante Init, un programador esperará que todos los eventos ya estén vinculados en el evento Load. ¿Qué pasaría si este programador plantea un evento de control de un niño en el código detrás? El evento Load ocurre primero en la raíz del árbol de control, y en todos los elementos secundarios, recursivamente. Por lo tanto, para cuando el programador intente plantear el evento del control secundario, ya no estará vinculado. Entonces esto no funcionará como se esperaba. Esto es más que suficiente para considerar inseguro enlazar eventos en el evento Load. Es por eso que siempre debe vincular eventos en Init.

Mira este diagrama para ver el orden de ejecución de la página & niños eventos: ASP.NET Page Life Cycle Diagram

+0

Esa es exactamente la razón por la que he publicado mi pregunta. Me gustaría tener una comprensión más profunda sobre POR QUÉ y CUÁNDO hacer ciertas cosas. Creo que entiendo el ciclo de vida de la página, cuándo crear mis controles, etc., pero no estaba seguro acerca de este cableado, porque he visto diferentes enfoques. Mientras que algunos programadores lo hacen durante el evento Load, otros como Init. Entonces, para completar mi pregunta, ¿la entiendo correctamente, que en realidad no importa mucho y solo necesito asegurarme de no hacerlo después de que el evento Load haya terminado? (LoadComplete, Prerender, etc.) – walther

+0

Creo que esto responde su pregunta a fondo ahora, después de la edición. – JotaBe

+0

Sí, finalmente obtuve una respuesta satisfactoria a mi pregunta, gracias :) – walther

1

He estado cableando la mía en la etiqueta de control. Si lo hago de esta manera, está claro que hay un controlador de eventos presente.

<asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" /> 

Si tuviera que cablear un controlador de eventos en el código subyacente, lo pondría en Page_Load como una llamada a una función privada.

+0

Sí, sé de esta posibilidad, pero ... No soy realmente un fan de esto, porque me gusta separar mis capas tanto como sea posible. Tengo un codificador que trabaja en la capa de presentación (javascript, html, css ..) y realmente no veo una razón por la cual él debería saber o incluso preocuparse por el cableado de los controladores. Si estoy trabajando solo, podría perfectamente, pero esto realmente no responde mi pregunta. ¿Dónde conectarías un controlador si tuvieras que hacerlo en un código subyacente? – walther

+0

@walther - Gracias por el comentario. Entiendo la necesidad de mantener las cosas separadas. Si tuviera que ponerlo en el código subyacente, crearía primero una función para configurar mis controladores de eventos y luego llamar a la función desde Page_Load. – DaveB

Cuestiones relacionadas