Quando desenvolvemos em asp.net as páginas são criadas por uma interface gráfica arrastando objetos para um formulário, que depois de compilado e publicado no site recebemos em um formato html padrão após sua requisição. Até aqui não existe nenhuma novidade, somente um pergunta que muitas vezes nos passa despercebido: Como é feito este controle para interagir com nosso código?
Entender melhor como isso é feito é objetivo deste artigo, e tirando proveito deste conhecimento poderemos, por exemplo:
- Dispara uma rotina em nosso código sem estar associada a nenhum controle
- Criar controles mistos, ex. um cheboxlist junto com radiobutton html
- Usar uma página com frames controlando outro frame e disparando eventos em outra página.
Para chegarmos a estes exemplos iremos nos valer de alguns códigos em javascript que aliais é a base de como isso é controlado pelo asp.net.
Os Webcontrols que colocamos em nossa página não são “tag” reconhecidas pelos browsers, sendo necessário executar uma conversão para ser enviada e processada de forma compatível ao cliente (browser). Nesta conversão é necessário atribuir-se nomes únicos para cada controle e criar rotinas que possam ser disparadas pelo lado do cliente, correspondendo às ações feita pelo usuário, enviando ao servidor para que saiba quem disparou este evento.

No Diagrama acima um browser solicita uma pagina a um servidor e enviando junto com esta solicitação, suas características (Como versão, tipo, capacidade e sistema operacional). O servidor recebe estas informações, localiza a página e gera uma pseudo-página sobre o layout já definido.
O resultado deste processo é submetido a outro processo, que transforma esta pseudo-página no formato compatível pelo browser correspondente. Finalmente o resultado desta transformação é enviado ao cliente.
Para sabermos um pouco mais do que é gerada basta apenas um pouco de curiosidade, e em nosso browser pedirmos para ver o código da página recebida. vamos ao um exemplo retirado de uma página:
... |
O código acima foi gerado de uma página com apenas 1 webcontrol (LinkButton).
Podemos perceber que alem da transformação do LinkButton em uma link ... foi inserido um script com uma função de nome __doPostBack e 2 campos invisíveis : __EVENTTARGET , __EVENTARGUMENT.
O webcontrol LinkButton1 também foi modificado e inserido dentro do elemento “href” uma chamada a função __doPostBack, passando como parâmetro o nome do controle e outro parâmetro vazio.
Com isso começamos a ter uma idéia melhor como esta sendo executado as páginas gerando nossa primeira dica:
Dica : Todo a submissão ao servidor é feita pela função __doPostBack , que por sua vez salva em __EVENTTARGET o nome do controle que foi utilizado para disparar o envio e em __EVENTARGUMENT um parâmetro opcional que pode ser passado por um controle.
Quando inserimos algum webcontrol do tipo validator mais alguns códigos e funções Javascript são colocadas em nosso código. Embora não seja o foco deste artigo vejamos como fica o código gerado, após inserir um Textbox em um RequiredFieldValidator em um formulário:
Página antes da geração:
<HTML> |
Página após o processamento
< script language="javascript" src="/aspnet_client/system_web/1_1_4322/WebUIValidation.js"></script> |
Olhando o código gerado, novamente vemos que possui a função __doPostBack e os 2 campos invisíveis : __EVENTTARGET , __EVENTARGUMENT, só que agora, ao final, temos mais algumas funções em javacript que são as responsáveis pela validação dos controles no lado ”cliente”.
Os detalhes a serem observados são:
<form name="Form1" method="post" action="WebForm2.aspx" language="javascript" onsubmit="ValidatorOnSubmit();" id="Form1"> (Que garante que antes de ser submetido o formulário seja executa a função ValidatorOnSubmit() )
<script language="javascript" src="/aspnet_client/system_web/1_1_4322/WebUIValidation.js"></script> (Que insere no formulário um conjunto de funções responsáveis pela validação dos diversos controles do tipo validator, este arquivo é criado automaticamente no IIS quando instalamos o Framework)
<a id="LinkButton1" href="javascript:{if (typeof(Page_ClientValidate) != 'function' || Page_ClientValidate()) __doPostBack('LinkButton1','')} " style="Z-INDEX: 100; LEFT: 40px; POSITION: absolute; TOP: 56px">Enviar </a> (Que foi alterada para chamar antes da função __doPostBack as funções de validação do formulário)
Dica: A função __doPostBack não é gerada caso não possua nenhum controle de submissão declarado na pagina (ex: LinkButtom, CommandButtom etc.). Uma forma simples de contornar isso é colocar um linkbutton com atributo Texto vazio no formulário. Como atributo vazio ele fica “invisível” no formulário porem é criado a função de submissão __doPostBack.
Conhecendo agora a função __doPostBack e os campos invisíveis __EVENTTARGET e __EVENTARGUMENT podemos disparar eventos em código, usando apenas as chamadas a esta função e campos. Vejamos o exemplo abaixo:
<HEAD> |
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load |
Abaixo o resultado antes e depois de pressionado o botão.

A execução do código acima demonstra um botão do tipo input type="button" disparando uma rotina especifica declarada em nosso código(MinhaFunção) com uma passagem de parâmetro sem estar associado a nenhum evento ou webcontrol.
Como já vimos, existe a transformação de nossas webcontrol em tags Html que possam ser reconhecidas pelo nosso browser. Se valendo deste conhecimento podemos inserir de uma forma não tradicional controles dentro de controles como veremos a seguir:
Primeiro vamos saber como é o resultado de um controle do tipo chekboxlist:

<form name="Form1" method="post" action="WebForm3.aspx" id="Form1"> |
Pelo resultado vemos que as opções estão sobre tags o que sugere a próxima dica:
DICA : Se em vez de um texto colocamos toda uma instrução HTML, ela será mostrada de acordo com a tag inserida (desde que o resultado do controle seja uma tag que permita esta operação).
Agora veja o resultado que se pode obter baseado nesta dica:


<HTML> |
O objetivo foi colocar dentro de um listitem um outro controle (HTML) que é apresentado junto com o texto do item, ou ainda modificando a forma de apresentar (como foi o caso do link <a>...</a> da opção 2).
Vejam a tela abaixa e o código que esta sendo usado:

<HTML> |
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load |
Inserimos dentro dos Listitens do checkboxlist, tags Html de um controle radiobutton. Para poderemos persistir a seleção dos radiosButton foi criado outro controle “Hidden1” para guardar a seleção feita e ser manipulado pelo nosso código (alteramos para rodar na forma runat="server").
Dentro do evento Page_Load identificamos o disparo dos radiobuttons (pelo campo __EVENTTARGET) e mostramos em texbox1 o valor selecionado, salvando a posição do radiobuttom selecionado em “Hidden1”. Quando a página é retornada o script, ao final da página, se encarrega de “setar” corretamente o radiobuttom escolhido, persistindo assim a informação.
Trabalhar com frames em página possibilita algumas facilidades e poupa o custo de estamos indo ao servidor para redesenhar toda a tela, porem tem o inconveniente de complicar o controle ou disparo de eventos em outra paginas e/ou frames. Conhecendo agora a função __doPostBack fica bem mais simples o trabalho, veja o script abaixo:
<form name="Form1" method="post" action="WebForm3.aspx" id="Form1"> |
A primeira função AtualizaFrame é usada para controlar qual página vai ser apresentada e sobre qual frame.
A segunda função PostFrame dispara um evento(PostBack) na pagina que vai ser diaparda o evento.
Desta forma controlamos a apresentação de páginas e eventos em outros frames!.
Obs.: Este script deve ser colocado na página que ira controlar as ações.
Apresentamos neste artigo algumas maneiras de se tirar proveito da forma que é feito o processo de controle e envido de informações. Os códigos apresentados têm apenas o intuito de demonstrar a funcionalidade do que foi proposto deixando a cargo do desenvolvedor explorar este recurso adaptando os conceitos aos mais diversos cenários. Até o próximo artigo.
Sobre o Autor: Fernando Cerqueira (fernandocerqueira@msn.com)é Microsoft MVP em ASP.NET , possui formação acadêmica em administração de empresas, CEO da FCI Sistemas, especializada em Call Center e BI/CRM. Atuou em diversas empresas de grande porte, sempre utilizando a plataforma Microsoft. Desde 2002 vem trabalhando com o Visual Studio .NET prestando consultoria e treinamento focando os resultados em ASP.NET. Em 2003 criou o GURJ.NET - Grupo de usuários .NET do Rio de Janeiro (www.gurj.net) sendo reconhecido pelo INETA.O grupo já realizou diversos eventos de porte como os Roads Shows e DevDay no Rio de Janeiro. Blog: (http://br.thespoke.net/MyBlog/FCerqueira/MyBlog.aspx)