Modelo de Eventos de Controle do Servidor Web ASP.NET

Um recurso importante do ASP.NET é que ele permite a você programar páginas da Web usando um modelo com base em eventos que é semelhante ao de aplicativos cliente.Como um exemplo simples, você pode adicionar um botão a uma página da Web do ASP.NET e então escrever um manipulador de eventos para o evento de clique do botão.Embora isso seja comuns em páginas da Web que trabalham exclusivamente com script de cliente (manipulando o evento onclick do botão no HTML dinâmico), ASP.NET traz esse modelo para processamento baseado em servidor.

Eventos disparados por controles de servidor ASP.NET trabalham um pouco diferentemente dos eventos em páginas HTML tradicionais ou dos aplicativos da Web baseados no cliente.A diferença surge principalmente devido a separação entre o evento em si e de onde o evento é manipulado.Em aplicativos baseadas no cliente, os eventos são disparados e manipulados no cliente.Em páginas da Web ASP.NET, no entanto, eventos associados a controles do servidor são originados no cliente (navegador) mas são manipulados pela página ASP.NET no servidor Web.

Para eventos disparados no cliente, o modelo de eventos do controle da Web do ASP.NET requer que as informações do evento sejam capturadas no cliente e uma mensagem de evento seja transmitida ao servidor, através de uma postagem HTTP.A página deve interpretar a postagem para determinar qual evento ocorreu e depois chamar o método apropriado no seu código no servidor para manipular o evento.

ASP.NET trata a tarefa de captura, transmissão, e interpretação do evento.Quando você cria manipuladores de eventos em um página da Web do ASP.NET, normalmente você pode fazê-lo sem pensar sobre como as informações de evento são capturadas e disponibilizadas para seu código.Em vez disso, você pode criar manipuladores de eventos da mesma maneira você faria em um formulários de cliente tradicionais.Entretanto, existem alguns aspectos de tratamento de eventos em páginas da Web do ASP.NET dos quais você deve estar ciente.

Conjunto de Eventos para Páginas e Controles do Servidor

Como a maioria dos eventos de controle do servidor do ASP.NET requerem processamento no servidor, eles podem afetar o desempenho de uma página.Portanto, os controles do servidor oferecem um conjunto limitado de eventos, apenas eventos acionados por clique.Alguns controles do servidor suportam eventos de alteração.Por exemplo, o controle de servidor Web CheckBox gera um evento CheckedChanged no código do servidor quando o usuário clica a caixa.Alguns controles do servidor suportam eventos mais abstratos.Por exemplo, o controle de servidor Web Calendar gera um evento SelectionChanged que é uma versão mais abstrata de um evento de clique.

Eventos que ocorrem com frequência (e podem ser disparados sem que o usuário saiba disso), como um evento onmouseover, não são suportados para os controles do servidor.Controles do servidor ASP.NET podem ainda chamar manipuladores do lado do cliente para esses eventos, conforme explicado posteriormente em Modelo de Eventos de Controle do Servidor Web ASP.NET.

Os controles e a própria página também disparam eventos de ciclo de vida em cada etapa de processamento, como Init, Load e PreRender.Você pode se aproveitar desses eventos de ciclo de vida em seu aplicativo.Por exemplo, no evento Load de uma página , você pode definir valores padrão para controles.

Argumentos de Evento

Eventos de página e controles ASP.NET com base no servidor seguem um padrão.NET Framework para métodos de manipuladores de eventos.Todos os eventos passam dois argumentos: um objeto que representa o objeto que disparou o evento e um objeto de evento contendo as informações específicas do evento.O segundo argumento é geralmente do tipo EventArgs, mas, para alguns controles, é de um tipo específico para esse controle.Por exemplo, para um controle de servidor Web ImageButton, o segundo argumento é do tipo ImageClickEventArgs, que inclui informações sobre as coordenadas em que o usuário clicou.

Observação:

Eventos para a página (por exemplo, o evento Load da página) pode aceitar os dois argumentos padrão, mas nenhum valor é passado nesses argumentos.

Eventos de Postback e de Não Postback nos Controles do Servidor

Em controles do servidor, determinados eventos, normalmente eventos de clique, fazem com que a página seja postada de volta (posted back) imediatamente para o servidor.Eventos de alteração em controles de servidor HTML e controles de servidor Web, como o controle TextBox, não causam imediatamente uma postagem.Em vez disso, eles são disparados na próxima vez que ocorrer uma postagem.

Observação:

Se o navegador oferecer suporte, controles de validação podem verificar a entrada de usuário usando script de cliente, sem um processamento no servidor.Para obter detalhes, consulte:Validando Entrada de Usuário em Páginas da Web ASP.NET.

Depois que uma página é postada de volta (posted back), os eventos de inicialização da página (Page_Init e Page_Load) são disparados, e então os eventos de controle são processados.Você não deve criar lógica de aplicativo que depende do disparo de eventos de alteração em uma ordem específica, a menos que você tenha conhecimento detalhado de processamento de evento de página.Para obter detalhes, consulte:Visão Geral do Ciclo de Vida da Página ASP.NET.

Se for útil para seu aplicativo, você poderá especificar que eventos de alteração farão com que a página seja postada.Controles do servidor Web que oferecem suporte a um evento de alteração contêm uma propriedade AutoPostBack.Quando essa propriedade é true, o evento de alteração do controle faz com que a página seja postada imediatamente, sem esperar por um evento de clique.Por exemplo, por padrão, um controle CheckBox do evento CheckedChanged não faz com que a página seja enviada.No entanto, se você definir o conjunto das propriedades AutoPostBack do controle para true,logo que um usuário clica na caixa de seleção, a página é enviada para o servidor para processamento.

Observação:

Para a propriedade AutoPostBack funcionar corretamente, o navegador do usuário deve ser definido para permitir scripts.Este é o padrão na maioria dos casos.No entanto, alguns usuários desativam scripts por motivos de segurança.Para obter detalhes, consulte:Script de Cliente em Páginas da Web ASP.NET.

Eventos Encaminhados

Controles de servidor Web, como os controles Repeater, DataList, GridView, FormView e DetailsView podem conter controles de botão que disparam por si mesmos eventos.Por exemplo, cada linha em um controle GridView pode conter um ou mais botões criados dinamicamente por modelos.

Em vez de cada botão disparar um evento individualmente, eventos dos controles aninhados são encaminhadas para a caixa de controles.A caixa de controles em contrapartida dispara um evento ItemCommand genérico com parâmetros que permitem que você descubra qual controle individual disparou o evento original.Respondendo a este único evento, você pode evitar ter que escrever manipuladores de eventos individuais para controles filho.

O evento ItemCommand inclui dois argumentos de evento padrão, um objeto referenciando a origem do evento e um objeto de evento contendo informações específicas do evento.

Observação:

O controle GridView, DataList e outros controles de dados oferecem suporte a eventos adicionais, como EditCommand,DeleteCommand e UpdateCommand,que são casos especiais de eventos encaminhados.

Com os botões, você pode usar a propriedade CommandArgument para passar uma sequência de caracteres especificado pelo usuário para o manipulador de eventos para ajudá-lo a identificar qual botão dispara o evento.Por exemplo, em um controle DataList, os botões disparam o evento ItemCommand.Você pode definir a propriedade CommandArgument de cada botão para um valor diferente — talvez um valor do botão seja "ShowDetails" e outro valor de botão seja "AddToShoppingCart" — e então captura depois esses valores no manipulador de eventos.

Ligando Eventos a Métodos

Um evento é uma mensagem como "um botão foi clicado".Em seu aplicativo, a mensagem deve ser convertida em uma chamada a um método no seu código.A ligação entre a mensagem de evento e um método específico—ou seja, um manipulador de eventos— é feita usando um representante do evento.Para obter mais informações, consulte Eventos e representantes.

Em páginas da Web ASP.NET, não é preciso explicitamente codificar esses representantes se o controle for criado declarativamente (na marcação) na página.Ligação de evento pode ser feita de várias maneiras, dependendo de qual evento você estiver ligando e e qual linguagem de programação você está usando.Para obter detalhes, consulte:Como: Criar Handlers evento in Páginas Web ASP.NET.

Ligando Eventos de Controle

Para controles declarados na página, você pode ligar um evento a um método, definindo um atributo (propriedade) na marcação do controle.O exemplo de código a seguir mostra como vincular o evento Click de um controle ASP.NET Button para um método chamado ButtonClick.

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

Quando a página é compilada, o ASP.NET procura por um método chamado ButtonClick e confirma se o método possui a assinatura apropriada (ele aceita dois argumentos, um do tipo Object e outro do tipo EventArgs).O ASP.NET depois liga o evento ao método automaticamente.

Como alternativa no Visual Basic, você pode ligar eventos a métodos usando a palavra-chave Handles na declaração do manipulador de eventos, como no exemplo de código a seguir:

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

Ligando Eventos de Página

As páginas ASP.NET disparam eventos de ciclo de vida, como Init, Load, PreRender e outros.Por padrão, é possível ligar eventos de página a métodos usando uma convenção de nomes de Page_eventname.Por exemplo, para criar um manipulador para o evento Load de página, crie um método chamado Page_Load.Em tempo de compilação, o ASP.NET localizará métodos com base nesta convenção de nomeação e executará automaticamente a ligação entre o evento e o método.Você pode usar a convenção de Page_eventname para qualquer evento exposto pela classe Page.

Observação:

Métodos de manipulação de eventos Page não requerem nenhum argumento.

Se você preferir, você pode criar manipuladores explicitamente.A ligação automática de eventos de página com base no convenção de nomes de métodos é controlada por uma propriedade de página chamada AutoEventWireup.Por padrão, essa propriedade é definida como true, e o ASP.NET executa a pesquisa automática e ligação descrita anteriormente.Alternatively, you can set this property to false by adding the attribute AutoEventWireup=false in the @ Page directive.Você pode então criar métodos com qualquer nome e ligá-los a eventos de página explicitamente.No Visual Basic, você pode usar a palavra-chave Handles, como no exemplo de código a seguir:

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

A desvantagem do atributo AutoEventWireup é que ele requer que os manipuladores de eventos de página tenham nomes específicos, previsíveis.Isso limita a flexibilidade de como você nomeia os manipuladores de eventos.

Observação:

Se você incluir uma ligação explícita a eventos de página, certifique-se que a propriedade AutoEventWireup esteja definida como false para que o método não seja inadvertidamente chamado duas vezes.

Ligações Explícitas para Controles Dinâmicos

Se você criar controles declarando-os na marcação, é possível ligar eventos a métodos usando um atributo (por exemplo, onclick) ou no Visual Basic, usando a palavra-chave Handles.Se você criar controles dinamicamente (no código), você não poderá usar nenhum desses métodos, porque o compilador não tem uma referência ao controle em tempo de compilação.

Nesse caso, você deve usar ligação de evento explícita.No Visual Basic, você pode usar a instrução AddHandler para ligar um evento em um controle criado dinamicamente a um método existente.Em C#, você cria um representante e associa-o com o evento do controle.O exemplo de código a seguir mostra como você pode acoplar um método chamado ButtonClick a um evento Click de botão:

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

Respondendo Tanto aos Eventos do Cliente Quanto aos Eventos do Servidor em Controles do Servidor ASP.NET

Este tópico abordou como trabalhar com eventos disparados no código do servidor.Controles devolvem elementos para o navegador, e esses elementos também podem disparar eventos do lado do cliente que você pode manipular no script de cliente.Usando script de cliente, você pode adicionar manipulação de eventos de mouse e teclado a controles de servidor ASP.NET.Para obter mais informações, consulte Script de Cliente em Páginas da Web ASP.NET e Como: Adicionar cliente Script Events para controles de servidor Web do ASP.NET.

Eventos de Sessão e Aplicativo

Além de eventos de página e controle, o ASP.NET fornece maneiras para você trabalhar com eventos de ciclo de vida que são disparados quando o aplicativo é inicializado ou terminado ou quando uma sessão de usuário individual inicia ou para, incluindo o seguinte:

  • Eventos de aplicativo são disparados para todas as solicitações a um aplicativo.Por exemplo, o evento BeginRequest do objeto HttpApplication (Application_BeginRequest) é disparado quando qualquer página da Web ASP.NET ou serviço Web XML no seu aplicativo é solicitada.Esse evento permite-lhe inicializar os recursos que serão usado para cada solicitação ao aplicativo.Um evento correspondente, o evento EndRequest do objeto HttpApplication (Application_EndRequest), te fornece uma oportunidade para fechar ou não dispor dos recursos utilizados para a solicitação.

  • Eventos de sessão são semelhantes aos eventos do aplicativo (há um evento Start e um evento End), mas são disparados com cada sessão exclusiva dentro do aplicativo.Uma sessão começa quando um usuário solicita uma página pela primeira vez no aplicativo e termina quando seu aplicativo explicitamente fecha a sessão ou quando a sessão expira.

    Observação:

    O evento Session_End nem sempre é disparado.Para obter detalhes, consulte:End.

Você pode criar manipuladores para esses tipos de eventos no arquivo Global.asax.Para obter detalhes, consulte Ciclo de Vida do Aplicativo ASP.NET uma visão geral para o IIS 5.0 e 6.0 e Sintaxe Global.asax .

Consulte também

Conceitos

Visão Geral sobre o Gerenciamento de Estado do ASP.NET

Outros recursos

Como: Criar Handlers evento in Páginas Web ASP.NET

Tratamento de Evento de servidor em páginas da Web ASP.NET