P>

capaNET38.JPG

Clique aqui para ler todos os artigos desta edição

ASP.NET

Criando controles customizados para ASP.NET

 

O ASP.NET, como subconjunto do .NET Framework provê, em conjunto com outras tecnologias, uma excelente infra-estrutura, e por si só um amplo conjunto de classes, o tão falado framework, para que possamos programar aplicações voltadas para a Web. Ele oferece em conjunto com o Visual Studio, uma produtividade não alcançada com facilidade (se alcançada) por outros frameworks para construção de páginas Web.

Há mais de cinco anos, antes do ASP.NET ser lançado junto com a versão 1.0 do .NET Framework, mencionar que o desenvolvimento voltado para aplicativos Web seria quase tão prático e rápido quanto o dos aplicativos Windows renderia adjetivos como “maluco” ou “fora da realidade” (ou “visionário”, dependendo do interlocutor). Quem imaginaria que, com o simples arrastar e soltar de um controle e um duplo clique, automaticamente seria gerado o código para lidar-se com o Click de um botão?

Ou ainda, que todo o código seria compilado e teria uma performance superior a 30% comparando-se à versão anterior, integrando-se perfeitamente ao servidor Web, hoje líder de mercado no mundo, o IIS? Tudo isso hoje é realidade e não é nenhuma novidade.

Existe uma característica do .NET Framework que é absolutamente fundamental para seu sucesso: ele é extensível; e não só extensível como facilmente extensível. Já que é totalmente Orientado a Objetos, permite substituir e/ou melhorar diversos de seus componentes ou até mesmos reconstruí-los por completo. Essa característica permitiu que os desenvolvedores hobbistas ou não profissionais, utilizassem o ASP.NET com toda sua facilidade, assim como o desenvolvedor profissional o utilizasse com toda sua flexibilidade e possibilidades.

Isso se provou uma verdade tão forte que a Microsoft percebeu um grande mercado de hobbistas e entusiastas e lançou as versões Express do Visual Studio 2005 e do SQL Server, que são gratuitas. Buscando compreender mais profundamente o que o ASP.NET tem de melhor, vamos buscar uma das maneiras de estendê-lo mais utilizadas, já que existem muitas, e sem dúvida uma das mais úteis: a criação dos controles customizados.

Porque criar um controle customizado?

Todos sabemos que um Textbox é muito funcional, assim como um ImageButton. Ambos são bastante configuráveis, trazem eventos onde podemos interagir e possuem modelos de objeto bastante ricos. Mas com freqüência necessitamos de controles que tenham um comportamento personalizado, especial para determinado tipo de aplicação ou ainda um controle que reproduza um comportamento padronizado em todos os projetos da empresa, podendo inclusive gerar HTML customizado.

Podemos atingir isso utilizando a velha técnica do ASP 3, ou seja, com o Response.Write, que apesar de tudo, funciona bem. Seu maior problema é a falta de reutilização que geralmente marca esse tipo de código e o fato de fugirmos completamente ao estilo de programação do ASP.NET. Uma vez criada a lógica para gerar o código HTML em uma página Web com essa técnica, essa lógica está presa nessa página.

Não pode ser estendida ou manipulada com facilidade e ainda que a coloquemos em uma camada separada, provavelmente estaremos fugindo radicalmente da Orientação a Objeto e correndo o risco de tentar reinventar a roda. Acredite, a Microsoft gastou muito tempo e esforço inventando “essa roda”, de forma que não vale a pena tentar reinventá-la. Ganhamos muito mais, criando em cima da infra-estrutura do .NET Framework/ASP.NET.

Nos casos apontados, além de inúmeros outros, o melhor a fazer é criar controles customizados. Com eles você pode manter a Orientação a Objetos e utilizá-la para deixar o código mais funcional, mais fácil de ler, de estender e porque não, mais elegante.

As características parametrizáveis do controle ficam armazenadas em propriedades, da mesma forma utilizada com os controles padrão do ASP.NET e também possuirá métodos e eventos, com toda a lógica encapsulada e separada do código da página Web, tornado-a mais limpa.

Tipos de controles customizados

Existem três tipos de controles customizados, sendo:

1.      Web User Controls (Controles Web de Usuário): são os mais fáceis de criar, mas dependem de um arquivo ASCX para existir, de forma que podem residir em apenas uma aplicação. Até a versão 2003 do Visual Studio não exibiam uma interface gráfica na página que fosse hospedá-lo. Permite criar a interface gráfica do controle da mesma forma com que criamos em um formulário Web, com auxílio do designer do Visual Studio e da Toolbox, com todo o apoio que um ambiente RAD oferece. Fazem muito sentido para controles muito específicos, que podem ser criados a partir da associação de outros controles para exibir um comportamento e que não pretende-se utilizar em outras aplicações;

2.      Composite Custom Controls (Controles Customizados Compostos): são criados completamente em código, que se utilizam das funcionalidades já existentes em outros controles Web (como Textbox, Label e Button) para criar o HTML que geram. Como são criados completamente em código, com uma classe, podem ser encapsulados em um Assembly que pode ser referenciado por diversos projetos diferentes. Tem suporte total do designer do Visual Studio desde a versão 2003, para a página que vai hospedar o controle, da mesma forma que os controles intrínsecos do ASP.NET. Podem também ser gerados a partir da herança direta de algum outro controle Web pré-existente, apenas estendendo e modificando suas características;

3.      Rendered Custom Controls (Controles Customizados Renderizados): têm o código HTML que será gerado do zero, não dependendo de nenhum controle externo. Em todo o resto são exatamente como os controles customizados compostos.

A linha que separa os controles compostos dos controles renderizados é pequena e didática. Um controle pode ter a maior parte de sua lógica implementada gerando código HTML do zero e utilizar um outro controle para que o auxilie na geração de algum HTML muito específico.

Todos os controles são utilizados através da diretiva de página <% Register %>, com algumas diferenças nessa diretiva entre os Web User Controls e os outros dois tipos. Veremos alguns exemplos adiante.

Vamos tratar com mais detalhe da criação dos controles que não têm suporte ao designer, ou seja, dos controles customizados compostos e dos controles customizados renderizados. O último será tratado com mais profundidade, já que é nele que realmente temos acesso à geração de código HTML.

Sugiro a criação de um controle Web de usuário, para visualizar seu funcionamento, já que ele é bastante simples. Para criar um, dentro da sua aplicação ASP.NET, acesse o menu Website>Add New Item. Escolha o item Web User Control e clique em Add. Para colocá-lo na página basta arrastar o mesmo do Solution Explorer para a página em que for utilizá-lo. As técnicas vistas a seguir podem ser utilizadas também em boa parte com esse tipo de controle.

Um controle web customizado

Controles customizados são classes, que herdam a maior parte das suas funcionalidades de WebControl (do namespace System.Web.UI.WebControls) e implementam algumas interfaces, de acordo com a necessidade de cada tipo de controle.

Dessa forma, podem ser compiladas em Assembly, armazenadas no GAC, distribuídas, enfim, têm o mesmo comportamento de qualquer outra classe. Todas as propriedades públicas de um controle Web podem ser utilizadas programaticamente (como qualquer classe) ou no código HTML, declarativamente, da mesma forma que utilizamos a propriedade Text do Textbox, por exemplo:

 

<asp:TextBox ID="TextBox1" runat="server"

  Text="Text é uma propriedade como qualquer outra.">

asp:TextBox>

 

Controles customizados compostos

Para criar um controle customizado composto, basicamente utilizamos o CreateChildControls, da classe base WebControl, para fazer o mesmo trabalho feito visualmente com o designer em uma página Web. Precisamos de um Label? Sobrescrevemos o CreateChildControls, instanciamos um e o adicionamos à propriedade Controls do controle, que contém a coleção de controles filhos do controle que estamos criando.

Simples assim. Ao final, todos os controles adicionados à essa coleção são renderizados.  Assim, por exemplo, no caso da criação de um controle composto contendo um Textbox para entrada, um Label para saída e um botão para execução, todo o código necessário está presente na Listagem 1.

 

Listagem 1. Exemplo de criação de um controle composto simples

Public Class Cores

  Inherits WebControl

  Protected _lblSaida As New Label

  Protected _txtEntrada As New TextBox

  Protected WithEvents _btnExecuta As New Button

...

Quer ler esse conteúdo completo? Tenha acesso completo