Compartir a través de


Modelo de eventos de control de servidor Web ASP.NET

Actualización: noviembre 2007

Una característica importante de ASP.NET es que permite programar páginas Web utilizando un modelo basado en eventos similar al de las aplicaciones de cliente. Como ejemplo sencillo, se puede agregar un botón a una página Web ASP.NET y, a continuación, escribir un controlador de eventos para el evento de clic del botón. Aunque esto es habitual en páginas Web que funcionan exclusivamente con una secuencia de comandos de cliente (que controla el evento onclick del botón en HTML dinámico), ASP.NET traslada este modelo al procesamiento basado en servidor.

Los eventos producidos por los controles de servidor ASP.NET funcionan de manera diferente a los eventos de las páginas HTML tradicionales o de las aplicaciones Web basadas en el cliente. La diferencia se basa principalmente en la separación existente entre el propio evento y el lugar donde se controla el evento. En las aplicaciones basadas en cliente, los eventos se producen y controlan en el cliente. Sin embargo, en las páginas Web ASP.NET, los eventos asociados a los controles de servidor se originan en el cliente (explorador) pero los controla la página ASP.NET en el servidor Web.

Para los eventos que se producen en el cliente, el modelo de control de eventos Web ASP.NET necesita que la información del evento se capture en el cliente y que se transmita un mensaje de evento al servidor mediante un envío HTTP. La página debe interpretar el envío para determinar el evento ocurrido y, a continuación, llamar al método apropiado del código del servidor para controlar dicho evento. Para obtener más información, vea Modelo de eventos de control de servidor Web ASP.NET.

ASP.NET controla la tarea de capturar, transmitir e interpretar el evento. Al crear controladores de eventos en una página Web ASP.NET, no es necesario saber capturar la información del evento y hacer que esté disponible para el código. En cambio, se pueden crear controladores de eventos casi de la misma forma que en un formulario de cliente tradicional. Sin embargo, hay diversos aspectos del control de eventos en las páginas Web ASP.NET que se deben tener en cuenta.

Conjunto de eventos para controles de servidor y páginas

Debido a que los eventos de controles de servidor ASP.NET requieren un viaje de ida y vuelta al servidor para procesarse, pueden afectar al rendimiento de una página. Por lo tanto, los controles de servidor ofrecen un conjunto limitado de eventos, normalmente sólo de tipo clic. Algunos controles de servidor admiten los eventos de cambio. Por ejemplo, el control CheckBox de servidor Web produce un evento de cambio CheckedChanged cuando el usuario hace clic en el cuadro. Algunos controles de servidor admiten eventos más abstractos. Por ejemplo, el control de servidor Web Calendar provoca un evento SelectionChanged que es una versión más abstracta del evento de clic.

Los eventos que tienen lugar con frecuencia (y que pueden provocarse sin que el usuario lo sepa), como onmouseover, no se pueden usar en los controles de servidor. Los controles de servidor ASP.NET siguen pudiendo llamar a los controladores de cliente para esos eventos, como se explica más adelante en Events in ASP.NET Server Controls.

Los controles y la propia página también provocan eventos de ciclo de vida en cada paso del procesamiento, como Init, Load y PreRender. Puede aprovecharse de estos eventos de ciclo de vida en la aplicación. Por ejemplo, en el evento Load de una página, puede establecer valores predeterminados para los controles.

Argumentos de eventos

Los eventos de los controles y de páginas ASP.NET siguen un modelo de .NET Framework estándar para los métodos de controladores de eventos. Todos los eventos pasan dos argumentos: un objeto que representa al objeto que ha provocado el evento, y un objeto evento que contiene la información específica del evento. El segundo argumento suele ser de tipo EventArgs, pero para algunos controles es de un tipo específico de dicho control. Por ejemplo, para un control ImageButton de servidor Web, el segundo argumento es de tipo ImageClickEventArgs, que incluye información sobre las coordenadas donde el usuario ha hecho clic.

Nota:

Los eventos para la página (como Load) pueden aceptar los dos argumentos estándar, pero en estos argumentos no se pasa ningún valor.

Eventos Postback y Non-Postback en controles de servidor

En los controles de servidor, algunos eventos, generalmente los de clic, hacen que la página se envíe de vuelta inmediatamente al servidor. Los eventos de cambio en los controles de servidor HTML y de servidor Web, como el control TextBox, no ocasionan que se produzca una acción de envío inmediatamente. En su lugar, se generan la próxima vez que tenga lugar una acción de envío.

Nota:

Si el explorador lo admite, los controles de validación pueden comprobar la introducción de datos del usuario mediante secuencias de comandos de cliente sin realizar un viaje de ida y vuelta al servidor. Para obtener información detallada, vea Validar la información especificada por el usuario en páginas Web ASP.NET.

Una vez enviada de vuelta una página, se generan los eventos de inicialización (Page_Init y Page_Load) de la misma y, a continuación, se procesan los eventos de control. No se debería crear una lógica de aplicación en la que los eventos de cambio se generen en un orden específico a no ser que se conozca con detalle el procesamiento de los eventos de página. Para obtener información detallada, vea Información general sobre el ciclo de vida de una página ASP.NET.

Si resulta útil para una aplicación, se puede especificar que los eventos de cambio provoquen el envío de la página. Los controles de servidor Web que admiten un evento de cambio incluyen la propiedad AutoPostBack. Cuando esta propiedad está establecida como true, el evento de cambio del control provoca el envío inmediato de la página, sin esperar a que se produzca un evento de clic. Por ejemplo, de forma predeterminada, el evento CheckedChanged de un control CheckBox no provoca el envío de la página. Sin embargo, si se establece la propiedad AutoPostBack del control en true, en cuanto un usuario active la casilla de verificación, la página se envía al servidor para ser procesada.

Nota:

Para que la propiedad AutoPostBack funcione correctamente, el explorador del usuario deberá estar configurado para permitir la ejecución de secuencias de comandos. Ésta es la configuración predeterminada en la mayoría de casos. Sin embargo, algunos usuarios inhabilitan la ejecución de secuencias de comandos por razones de seguridad. Para obtener información detallada, vea Script de cliente en páginas web ASP.NET.

Eventos reenviados

Los controles de servidor Web como Repeater, DataList, GridView, FormView y DetailsView pueden contener controles de botón que a su vez generen eventos. Por ejemplo, cada fila de un control GridView puede contener uno o varios botones creados dinámicamente mediante plantillas.

En lugar de que cada botón provoque individualmente un evento, los eventos de los controles anidados se reenvían al control del contenedor. El contenedor produce a su vez un evento genérico ItemCommand con parámetros que permite saber qué control en concreto ha producido el evento original. Respondiendo a este evento único, puede ahorrarse tener que escribir controles de eventos individuales para cada control secundario.

El evento ItemCommand incluye los dos argumentos de evento estándar, un objeto que hace referencia al origen del evento y un objeto de evento que contiene información específica del mismo.

Nota:

Los controles GridView, DataList y otros controles de datos admiten eventos adicionales, como EditCommand, DeleteCommand y UpdateCommand, que son casos especiales de eventos reenviados.

En el caso de los botones, se puede utilizar la propiedad CommandArgument para pasar una cadena especificada por el usuario al controlador de eventos, con el fin de ayudar a identificar el botón que ha provocado el evento. Por ejemplo, en un control DataList, los botones provocan el evento ItemCommand. Se puede establecer la propiedad CommandArgument de cada botón en un valor distinto (por ejemplo, el valor de un botón puede ser "ShowDetails" y "AddToShoppingCart" el de otro), y más adelante capturar dichos valores en el controlador de eventos.

Enlazar eventos a métodos

Un evento es un mensaje parecido a "se ha hecho clic en un botón". En una aplicación, se debe traducir el mensaje en una llamada a un método del código. El enlace entre el mensaje del evento y un método específico (es decir, un controlador de evento) se lleva a cabo utilizando un delegado de eventos. Para obtener más información, vea Eventos y delegados.

En las páginas Web ASP.NET, no es necesario codificar explícitamente delegados si el control se crea mediante declaración (en el marcado) en la página. El enlace de eventos se puede lograr de distintas maneras, dependiendo del evento que se enlace y de qué lenguaje de programación se esté utilizando. Para obtener información detallada, vea Cómo: Crear controladores de eventos en páginas Web ASP.NET.

Enlazar eventos de control

Para controles declarados en la página, se puede enlazar un evento a un método estableciendo un atributo (propiedad) en el marcado del control. El ejemplo de código siguiente muestra cómo enlazar el evento Click de un control ASP.NET Button a un método denominado ButtonClick.

<asp:button id="SampleButton"  
   text="Submit" onclick="ButtonClick" />

Al compilar la página, ASP.NET busca un método denominado ButtonClick y confirma que éste tiene la firma adecuada (acepta dos argumentos, uno de tipo Object y otro de tipo EventArgs). A continuación, ASP.NET enlaza automáticamente el evento al método.

En Visual Basic, también se pueden enlazar los eventos a los métodos utilizando la palabra clave Handles en la declaración del controlador de eventos, como en el ejemplo de código siguiente:

Private Sub ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles SampleButton.Click

Enlazar eventos de página

Las páginas ASP.NET provocan eventos de ciclos de vida como Init, Load, PreRender y otros. De manera predeterminada, los eventos de página se pueden enlazar a los métodos utilizando la convención de nomenclatura de Page_eventname. Por ejemplo, con el fin de crear un controlador para el evento Load de la página, se puede crear un método denominado Page_Load. En tiempo de compilación, ASP.NET buscará los métodos que se basen en esta convención de nomenclatura y realizará el enlace automáticamente entre el evento y el método. Se puede utilizar la convención de Page_eventname para cualquier evento expuesto por la clase Page.

Nota:

Los métodos de control de eventos de página no requieren ningún argumento.

Si se prefiere, se pueden crear los controladores explícitamente. Una propiedad de página denominada AutoEventWireup controla el enlace automático de los eventos de página en función de la convención de nomenclatura del método. De manera predeterminada, esta propiedad se establece en true y ASP.NET realiza la búsqueda automática y el enlace descritos anteriormente. También se puede establecer esta propiedad en false agregando el atributo AutoEventWireup=false en la directiva @ Page. A continuación se pueden crear los métodos con cualquier nombre y enlazarlos a los eventos de páginas explícitamente. En Visual Basic, puede utilizar la palabra clave Handles, como se muestra en el siguiente ejemplo de código:

Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load

La desventaja del atributo AutoEventWireup es que precisa que los controladores de eventos de la página tengan nombres específicos y predecibles. Esto limita su flexibilidad en cuanto al modo de denominar los controladores de eventos.

Nota:

Si se incluye el enlace explícito para eventos de página, asegúrese de que la propiedad AutoEventWireup esté establecida como false para que no se llame dos veces al método inadvertidamente.

Enlace explícito para controles dinámicos

Si crea controles declarándolos en el marcado, puede enlazar eventos con métodos mediante un atributo (por ejemplo, onclick) o, en Visual Basic, con la palabra clave Handles. Si los controles se crean dinámicamente (en código), no se puede utilizar ninguno de estos métodos, porque el compilador no tiene una referencia al control en tiempo de compilación.

En ese caso, se debe utilizar el enlace de eventos explícito. En Visual Basic, puede utilizar la instrucción AddHandler para enlazar a un método existente un evento creado dinámicamente en un control. En C#, se crea un delegado y se asocia al evento de control. El ejemplo de código siguiente muestra cómo se puede enlazar un método denominado ButtonClick al evento Click de un botón:

Dim b As New Button
b.Text = "Click"
AddHandler b.Click, AddressOf ButtonClick
Placeholder1.Controls.Add(b)
Button b = new Button;
b.Text = "Click";
b.Click += new System.EventHandler(ButtonClick);
Placeholder1.Controls.Add(b);

Responder a eventos de cliente y de servidor en controles de servidor ASP.NET

En este tema se explica cómo trabajar con eventos generados en el código de servidor. Los controles representan los elementos para el explorador y esos elementos también pueden provocar eventos de cliente que se pueden controlar en las secuencias de comandos de cliente. Mediante el uso de secuencias de comandos de cliente, se puede agregar la capacidad de control de eventos de mouse y de teclado a los controles de servidor ASP.NET. Para obtener más información, vea Script de cliente en páginas web ASP.NET y Cómo: Agregar eventos de secuencias de comandos de cliente a los controles de servidor Web ASP.NET.

Eventos de aplicación y de sesión

Aparte de los eventos de página y de control, ASP.NET proporciona formas de trabajar con eventos de ciclo de vida que pueden provocarse al iniciarse o detenerse la aplicación, o cuando la sesión de usuario de un individuo determinado se inicia o se detiene, incluido lo siguiente:

  • Los eventos de aplicación se provocan para todas las solicitudes que se hacen a una aplicación. Por ejemplo, el evento BeginRequest del objeto HttpApplication (Application_BeginRequest)) se genera cuando se solicita cualquier página Web ASP.NET o servicio Web XML en una aplicación. Este evento le permite inicializar recursos que se utilizarán para cada solicitud a la aplicación. Un evento correspondiente, el evento EndRequest del objeto HttpApplication (Application_EndRequest), le proporciona la oportunidad de cerrar o eliminar los recursos utilizados por la solicitud.

  • Los eventos de sesión son similares a los de aplicación (existen los eventos Start y un evento End), pero se producen con cada sesión única dentro de la aplicación. Una sesión comienza cuando un usuario solicita una página por primera vez desde la aplicación y termina cuando la aplicación cierra explícitamente la sesión o cuando la sesión excede el tiempo de espera.

    Nota:

    El evento Session_End no se provoca en todas las circunstancias. Para obtener información detallada, vea End.

Se pueden crear controladores para estos tipos de eventos en el archivo Global.asax. Para obtener información detallada, vea Información general sobre el ciclo de vida de una aplicación ASP.NET para IIS 5.0 y 6.0 y Sintaxis de Global.asax.

Vea también

Conceptos

Información general sobre la administración de estados de ASP.NET

Otros recursos

Cómo: Crear controladores de eventos en páginas Web ASP.NET

Control de eventos del servidor en páginas Web ASP.NET