Validação de dados otimizada no ASP.NET

por Antônio Marcos O. A. Sena

Para ler todas as matérias da FórumAccess, assine a revista no endereço http://www.forumaccess.com.br/novo/

Este artigo discute:

Validação de Dados

  • Exportação para PDF

ASP .NET 2002 e 2003

 

 

INTRODUÇÃO

O ASP.NET revolucionou a forma como os sistemas são feitos para a WEB, promovendo grandes saltos de produtividade e disponibilizando recursos mais poderosos para o desenvolvedor. No entanto, esse avanço teve um preço: a pequena abertura a controles que podem ser feitos do lado do cliente (client side), ou seja, no próprio navegador, o que pode resultar em excesso de viagens ao servidor, se a página em ASP .NET não for bem projetada e planejada. Este artigo mostra como contornar esse problema quando a validação de dados é feita no lado do cliente, com a criação de um Custom Web Control que, depois de compilado, pode ser adicionado e manipulado no sistema WEB, como um outro controle qualquer.

A VALIDAÇÃO DOS DADOS

Quando o assunto é validação de dados, as opiniões são bastante controversas e, dificilmente, numa discussão acerca, uma conclusão final é alcançada. Para os que defendem a validação no lado do servidor, o ponto de maior importância é a segurança. Esta prática impede que o usuário realize algum tipo de manipulação ilícita e acabe burlando a segurança do site. Por outro lado, a validação no lado do cliente traz ganhos de performance, uma vez que os dados enviados ao servidor já estão prontos e devidamente corrigidos, bastando ao servidor, realizar salvamentos, alterações ou exclusões, reduzindo também o tráfego pela rede. Com a experiência de desenvolvimento para a WEB, o leitor perceberá que existem situações onde o mais indicado é validar dados no servidor e outras onde validar no cliente é a melhor opção. A análise deve levar em conta sempre a segurança e performance da aplicação.

SOBRE O CONTROLE CUSTOMIZADO

De uma certa forma, o ASP .NET inibe o tradicional trabalho que os profissionais tinham com o Java Script. Apesar de terem uma representação HTML em tempo de desenvolvimento, os controles ASP .NET não são representados dessa mesma forma em tempo de execução, quando a página é montada pelo navegador do cliente, o que leva a concluir que não adianta criar a função Java Script para tratar aquele controle criado no WEB Form: uma página ASP .NET só retorna o HTML interpretado pelo browser quando ela é executada pelo servidor.

Uma solução largamente utilizada e sugerida é a criação de Custom Web Controls, que são capazes de gerar o Java Script necessário. Dessa forma, quando uma ação é executada na página ou quando ela é carregada, o Custom Web Control se encarrega de montar o Script que será executado. O controle a ser criado consiste em receber os objetos que serão validados, juntamente com suas mensagens de alerta. Há ainda a possibilidade de definir uma mensagem personalizada, ou utilizar uma padrão, que é parte integrante do controle. A validação aqui sugerida é apenas para verificar o preenchimento de campos obrigatórios, mas o exemplo pode muito bem ser adaptado para atender outros tipos de validações, como número de CPF ou CNPJ, por exemplo. É muito comum em .NET vermos livros e artigos explicando a criação de WebControls. Mas a criação de WebControls que normalmente é explicada é feita com uso de arquivos ASCX. Os Custom Web Controls montados com arquivos ASCX são Web-Controls montados através de técnicas de composição, não herança. Além disso, apesar de serem reutilizáveis, sua reutilização envolve a própria cópia do código fonte, os arquivos ASCX e o arquivo ASCX.VB. Além disso, os componentes ASCX não são visualizados ou manipulados da mesma forma que os WebControls tradicionais, o que gera dificuldades e limitações. A alternativa é, ao invés de criar um ASCX, criar um Custom Web Control. Normalmente, o Custom Web Controlé mantido em um projeto separado, uma WebControlLibrary que, ao ser compilada, transformase em um assembly com extensão .dll Quando um projeto do tipo WebControlLibrary é criado, o VisualStudio já cria um componente, CustomWebControl.vb, só é preciso renomeá-lo e fazer a sua codificação. O leitor verá que a definição de propriedades de controles customizados no .NET é muito fácil, acompanhando o mesmo padrão dos controles nativos.

CRIANDO O CONTROLE CUSTOMIZADO

O objetivo desse artigo é ilustrar a criação de um Custom Web Control para a validação de controles no lado do cliente. Um projeto para um Custom Web Control pode ser criado através do botão New Project, na Start Page. Na janela New Project, mantendo a seleção de VisualBasic Projetcts em Project Types, basta selecionar o template Web Control Library. A figura 1 ilustra esse momento. Defina um nome para o projeto (no nosso caso será Validador) e um local para o seu salvamento. Ao clicar em Ok, o IDE do Visual Studio abre o conteúdo do arquivo que contém o código de execução do controle. O próximo passo é renomear três elementos, para que tudo fique em perfeita simetria:

Cc580650.R59_ValidacaoDadosASPNET_img_1(pt-br,MSDN.10).jpg
Figura 1 - Criando um novo projeto para um Custom Web Control

1.O nome do arquivo .VB, que pode ser trocado através do Solution Explorer. Para isso clique com o botão direito do mouse sobre o item com o nome WebCustomControl1.vb, selecione a opção Rename e escreva Validador.vb.

2.O nome da classe, na linha de declaração da classe, dentro do arquivo .VB

3.O atributoToolboxData que precisa ser corrigido. Este atributoindica como será a tag HTML do novo componente. Essas duas últimas alterações podem ser feitas na linha de código a seguir:

<DefaultProperty("Text"), ToolboxData("<{0}:WebCustomControl1

runat=server> </{0}:WebCustomControl1>")> Public Class

WebCustomControl1

O nome da classe é o último item da linha de comando. Ele deve passar a ser Validador. O atributo ToolboxData deve ser alterado para Validador, mas preste atenção que ele deve ser alterado duas vezes, onde a tag HTML é aberta e fechada. Essa é a linha de declaração da classe e ela fica logo abaixo da seção Imports. A solução completa pode ser encontrada no site da FórumAccess. O controle terá cinco propriedades:

Controles

<Bindable(False), Category("Misc"), DefaultValue("")> Public Property

Controles() As System.Collections.ArrayList

Get

Controles = lControles

End Get

Set(ByVal Value As System.Collections.ArrayList)

lControles = Value

End Set

End Property

Esta propriedade receberá os controles que têm o preenchimento de seu conteúdo obrigatório. Ela é do tipo ArrayList (System.Collections.ArrayList), mas também poderia ser do tipo Collection (System.Collection).

Mensagens

<Bindable(False), Category("Misc"), DefaultValue("")> Public Property

Mensagens() As String

Get

Mensagens = lMensagens

End Get

Set(ByVal Value As String)

lMensagens = Value

lMensagensLista = Split(lMensagens, ";")

End Set

End Property

Esta propriedade recebe os nomes dos campos que os controles representam. Ela é do tipo texto. Os nomes dos campos serão listados em seqüência e separados por ponto e vírgula (;). Os nomes dos campos listados nessa propriedade devem seguir a seqüência dos controles definidos na propriedade controles, para que as mensagens retornadas pelo Custom Web Control sejam formadas de forma coerente. A variávellMensagenLista é do tipo ArrayList, porisso, a função Split é utilizada para construir um array com as mensagens. Esse é o motivo pelo qual a separação das mensagens dos controles deve ser feita com o ponto e vírgula.

Formulário

Esta propriedade é do tipo texto e recebe o nome do formulário HTML em que os controles estão inseridos.

<Bindable(False), Category("Misc"), DefaultValue("")> Public Property

Formulario() As String

Get

Formulario = lFormulario

End Get

Set(ByVal Value As String)

lFormulario = Value

End Set

End Property

Esta propriedade é do tipo booleano e define se a resposta padrão ou se é a mensagem definida pelo desenvolvedor que será usada.

Aviso

<Bindable(False), Category("Behavior"), DefaultValue("True")> Public Property

Aviso() As String

Get

Aviso = lAviso

End Get

Set(ByVal Value As String)

lAviso = Value

End Set

End Property 
<Bindable(False), Category("Behavior"), DefaultValue("True")> Public Property

UtilizaFrasePadrao() As Boolean

Get

UtilizaFrasePadrao = lUtilizaFrasePadrao

End Get

Set(ByVal Value As Boolean)

lUtilizaFrasePadrao = Value

End Set

End Property

Esta propriedade recebe a frase definida pelo usuário que será usada na validação, se UtilizaFrasePadrao for verdadeiro.

PROGRAMANDO A RENDERIZAÇÃO DO CONTROLE

A renderização é o processo de geração de código HTML do componente para o cliente. Esse processo é realizado por todos os controles disponíveis em ASP .NET e por isso o HMTL gerado para o navegador do cliente é diferente do HTML criado em tempo de desenvolvimento. Todo Custom Web Control criado disponibiliza um método protegido chamado Render. Ao criar uma instância do controle no Web Form, o código HTML que esse controle retorna é criado assim que a página é montada pelo servidor e enviada ao navegador, ou conforme seu estado quando um Post Back é realizado. É preciso alterar o código padrão de método, que ficará como descrito a seguir.

A renderização vai gerar uma função em Java Script que fará a verificação do conteúdo dos controles. Caso eles estejam vazios, retornará uma mensagem e ficará aguardando o preenchimento desse controle. A variável f do tipo StringBuilder é a responsável por armazenar o bloco de texto que conterá os comandos que formarão a função Java Script.

O objeto StringBuilder é utilizado pois ele manipula concatenações de texto de forma mais rápida do que a utilização de variáveis e o “&”. Ao se utilizar-se o “&”, uma cópia do texto é criada, em seguida a concatenação é realizada e, por fim, a cópia do texto é eliminada da memória. O StringBuilder realiza as operações de concatenação de forma direta, sem o uso de artifícios intermediários. A primeira linha adicionada cria o bloco de instruções em Java Script e a segunda cria a função Validacao.

A estrutura For...Next é utilizada para percorrer todos os controles passados pela propriedade Controles e montar a verificação de cada um. Como os objetos no Web Form sempre são disponibilizados dentro de um formulário HTML, é preciso fazer a referência a esse formulário, através do objeto document. Por esse motivo existe a propriedade Formulário, para identificar o formulário que contém os controles. Se a propriedade UtilizaFrasePadrao estiver definida como verdadeira, a mensagem já fixada na rotina será utilizada.

Caso contrário, a mensagem definida pelo usuário, na propriedade Aviso é utilizada na montagem do bloco de script. A variável Mensagens é utilizada para compor a mensagem de alerta, com o nome do campo.

Conforme já foi explicado anteriormente, é importante que haja uma simetria entre os nomes dos campos definidos nessa propriedade e os controles definidos na propriedade Controles. Por fim, é acrescentado ao bloco, um comando para definir o foco para o controle cujo conteúdo não foi preenchido e o fechamento do bloco de script. A variável contador é incrementada para que haja uma coordenação entre os controles que são trabalhados pela estrutura For...Next e as mensagens passadas pela propriedade Mensagens.

O método RegisterStartupClient do objeto Page é utilizado para emitir o bloco de script, onde “MSG” é uma chave única utilizada para identificar o bloco de script e f.ToString é o bloco script. O método ToString do objeto StringBuilder é utilizado para converter esse objeto em texto. A palavra reservada Me, usada antes do objeto Page, identifica o Web Form em que o Custom Web Control foi criado.

UTILIZANDO O CUSTOM WEB CONTROL

O primeiro passo é compilar o projeto. Para fazer isso, é preciso acessar a opção Build Solution, no menu Build. Dessa forma uma DLL será criada na pasta onde está armazenado o projeto do Custom Web Control. O próximo passo é acrescentá-lo a uma aplicação. Paraisso, é preciso iniciar um projeto ou abrir um já existente. Faça como foi explicado na seção Criando o Controle Customizado, mas em vez de selecionar Web Control Library, selecione ASP.NET Web Application, em Location, defina “https://localhost/Validacao”. Para fazer a referência ao controle customizado basta selecionar a opção Add Reference no menu Project.

A janela Add Reference é aberta (Figura 2). O controle recém criado não está listado entre os componentes disponíveis em .NET. Ele deve ser buscado em seu local de criação, através do botão Browse. Ao fazer isso, ele fica automaticamente disponível na lista Selected Components, que na Figura 2 está vazia. A referência a esse controle também é visível no Solution Explorer na seção de referências.

É importante observar o valor da propriedade Copy Localna referência criada. Essa propriedade define se a DLL do controle será copiada para a pasta Bin da solução que contém a sua referência, no caso de verdadeiro, ou não, no caso de falso. Isso é muito prático, no sentido de eliminar a preocupação de ficar coletando as DLLs que fazem parte da aplicação na hora de distribuí-la. Feita a referência, agora é preciso acrescentar o controle à Toolbox. Para isso, é preciso clicar com o botão direito do mouse sobre ela e selecionar a opção Customize Toolbox... . A janela Customize Toolbox é aberta.

Cc580650.R59_ValidacaoDadosASPNET_img_8(pt-br,MSDN.10).jpg
Figura 2 - janela Add Reference no Visual Studio .NET

Cc580650.R59_ValidacaoDadosASPNET_img_9(pt-br,MSDN.10).jpg
Figura 3 - Janela Customize Toolbox no Visual Studio .NET

Na Figura 3 a guia .Net Framework Components já está selecionada, mas ao ser aberta a janela, a guia que aparece selecionada é a COM Components. Se a referência foifeita corretamente, aparecerá nalista de componentes um item com o nome Validador, com o namespace também Validador. Basta selecioná-lo, que aToolbox terá mais um controle adicionado. Agora é só criar o controle no Web Form, como qualquer outro controle. Acrescente também duas caixas de texto, duas labels e um botão de comando. A Tabela 1 descreve as propriedades que devem ser configuradas.

CONFIGURANDO O CUSTOM WEB CONTROL

Uma vez inserido no projeto, o controle customizado Validador pode ser trabalhado como qualquer outro objeto .NET. Selecione o controle Validador inserido no Web Form e defina as seguintes propriedades, conforme a Tabela 2. O evento Load do Web Form deve ser codificado da seguinte forma:

Cc580650.R59_ValidacaoDadosASPNET_img_10(pt-br,MSDN.10).jpg
Tabela 1 - Propriedades dos controles

Cc580650.R59_ValidacaoDadosASPNET_img_11(pt-br,MSDN.10).jpg
Tabela 2 - Propriedades do controle de validação

Os controles que serão trabalhados pelo Validador, são definidos manualmente. O método Add da propriedade Atributes do botão CmdOk é utilizado para que a função gerada pelo controle Validador, seja configurada para o evento onclick do botão, quando ele for renderizado para o cliente. Agora, é só fazer o teste, rodando a aplicação. Experimente várias combinações, clicando no botão Ok com todos os campos vazios, um preenchido de cada vez e finalmente com todos os campos preenchidos.

CONCLUSÃO

Existem controles específicos no Visual Studio .NET responsáveis pela validação de outros controles, mas a restrição é que, para cada controle a ser validado, é preciso criar um controle validador e o comportamento desses controles pode não ser adequado ao que o desenvolvedor almeja. É importante frisar que essa é uma solução simples para o problema de manipulação de script no .NET e que o controle de validação pode ter suas funcionalidades aumentadas, atendendo também a validações no lado do servidor. Até uma próxima!

* Antônio Marcos O. A. Sena (amoas@agesistemas.com.br) é formado em Economia e atua como Analista de Sistemas na AGE Sistemas, Consultoria e Treinamento Ltda. e Analista de Sistemas (Consultor) na INB (Indústrias Nucleares do Brasil), com uma experiência efetiva de 5 anos na área.

DISPONÍVEL PARA DOWNLOAD

VALIDADORES.EXE (ASP .NET 2002 e 2003) Disponível para download em www.forumaccess.com.br