Capítulo 5: Input Validation and Site Navigation Lição 1: Performing Input Validation
Autor: quintelab | Publicado: 2011-09-25T16:55:00-07:00

Este capítulo demonstra 2 recursos do asp.net.

O primeiro é a validação automática de entrada de dados em formulários web, podendo essas validações serem geradas como javascript melhorando assim o desempenho da resposta ao usuário. E também por segurança componentes que fazem validação do lado do servidor.

O outro recurso deste capítulo é sobre a navegação facilitada ao usuário com o uso de Web Parts.

Lesson 1: Performing Input Validation

Nesta lição serão apresentados controles que irão facilitar no momento de fazer validações de entrada de dados em formulários web.

Understanding the Validation Framework

A validação de dados é algo comum e rotineiro para desenvolvedores. O asp.net possui ferramentas que facilitam a criação dessas valições de forma rápida e com poucos códigos.

Existem 2 cenários que podem ser utilizados. Você pode utilizar a validação do lado do cliente, desta forma os controles irão gerar códigos javascripts que são rodados no browser, evitando assim que seja feita a comunicação com o servidor. Ou seja, antes mesmo do usuário clicar no botão "enviar/gravar" ele já terá uma resposta se esta preenchendo o formulário de maneira correta. Porém este é um cenário que não é totalmente seguro, usuário maliciosos podem facilmente "boicotar" essa validações que rodam do lado do cliente.

Porém o asp.net fornece ferramentas que fazem as mesmas validações do lado do servidor, garantindo assim maior segurança dos dados.

Adding Validation Controls to Your Page

Você pode localizar os controles de validação na ToolBox do Visual Studio, você irá proceder da mesma forma com que faz com outros controles. Siga os seguintes passos para adicionar uma validação a sua página:
Abra a página no Design view e abra a ToolBox. Adicione um controle de entrada de dados que será validado, como um TextBox ou RadioButtonList.
Vá até a aba Validation da Toolbox. Arraste um RequiredFieldValidator para próximo do TextBox que será validado como campo obrigatório.
Defina a propriedade ID do RequiredFieldValidator com um nome semelhante do ID definido ao TextBox, desta forma seu código ficará mais facil de ser entendido. Por exemplo, caso seu TextBox tenha a propriedade ID dfinida como NomeTextBox, defina o ID do RequiredFieldValidator como NomeTextBoxValidator.
Defina a propriedade ControlToValidate do seu RequiredFieldValidator com o ID do seu TextBox, neste caso, NomeTextBox.
Defina a propriedade ErrorMessage, esta será a mensagem exibida ao usuário, utilize algo que facilite o entendimento do usuário. É comum exibir essas mensagens todas em um único controle chamado ValidationSummary.
Defina a propriedade Text do TextBox para algo que "avise" o usuário que a validação falhou. Caso você utilize um ValidationSummary, pode definir a propriedade Text com um asterisco (*).
Caso não queria exibir nada na propriedade Text é recomendado utilize a propriedade tooltip com uma mensagem curta e similar a mensagem de erro que é exibida no ValidationSummary, desta forma quando o usuário levar o cursor ao TextBox irá ver que a validação falhou.
Caso não queira que seja exibida mensagem ao usuário se a validação falhe, defina a propriedade Display para None. Se deseja exibir a mensagem pro usuário, defina a propriedade como Static, porém como é uma mensagem estatica, defina uma mensagem em branco que irá aparecer antes de ocorrer a validação. Caso contrário deixe a propriedade como Dynamic para que o asp.net formate a saída do texto caso ocorra uma falha de validação;
Opcionalmente utilize o controle ValidationSummary para exibir várias mensagem de erros de validação. É muito útli quando possui vários controles que são validados e dificulta posicionar todas as mensagens de forma separada em sua página. É interessante que este controle seja posicionado próximo ao botão de submit ou no topo do formulário. Você pode definir a propriedade ShowMessageBox para true, onde este controle irá exibir um PopUp com as mensagens de erros de validação.
Server-Side Validation

Os controles de validação trabalham em conjunto com o objeto Pag, para garantir que os dados do clientes sejam válidos quando chegar ao servidor. A classe Page possui a propriedade Validators que contém que é uma coleção de todos os validadores da página. A classe possui também um método chamado Validate que pode ser executado para verificar cada controle de validação.

O Asp.net chama o método Validate automaticamente após o Load da página. Portando você pode descobrir se a página é válida através da propriedade Page.IsValid.

Client-Side Validation

O Asp.net escreve os códigos de validação do lado do cliente quando você utiliza um controle de validação. O Asp.net escreve os códigos javascript que são executados quando o usuário sai de um campo que possui algum tipo de validação.&nbsp;

Toda vez que um controle que possui uma validação perder o foco será disparado a validação javascript podendo assim exibir uma mensagem de aviso ao usuário. Você pode usar a propriedade SetFocusOnError para definir um foco ao controle quando sua validação falhar, desta forma o usuário so conseguirá sair deste campo quando entrar com dados válidos.

Determining When to Cause Validation

Utilizar a validação do lado do cliente é útil pois evita o envio da página para o servidor caso a página não seja válida. Porém isto pode ocasionar problemas em algumas situações. Por exemplo, caso você tenha um botão de Ajuda ou de Cancelar, estes botões não conseguiram disparar seus eventos para o servidor enquanto a página não estiver totalmente válida.

Para estes casos, existe a propriedade CausesValidation. Esta propriedade pode ser definida como false quando deseja que algum botão seja executado sem passar pela validação, pode ser usados em botão de Limpar, Voltar, etc...

Using Validation Groups

Existem cenários onde é necessário validar somente parte dos controles da sua página. Você pode agrupar seus controles de uma forma que serão válidados por grupos. Os controles de validação possuem a propriedade ValidationGroup que recebe uma string, esta string deve ser comum aos controles que deseja validar ao mesmo tempo.


Isso é possível por que o método Validate da página possue uma sobrecarga que recebe uma string como parâmetro, que é o ValidationGroup. Esta sobrecarga é executada quando ocorre um postback na página causando a validação dos controles.

O objeto Page possue também o método GetValidators que recebe uma string como parâmetro, neste caso devemos informar o ValidationGroup, e este método retornará todos os controles que são validados neste ValidationGroup.

Understanding the RequiredFieldValidator Control

O controle RequiredFieldValidator é utilizado para forçar que o usuário informe ou altere a informação de algum controle. O RequiredFieldValidator não valida informações como data, números inteiros e outros. Ele é utilizado para forçar o usuário a preencher os dados.

Além de obrigar o usuário a preencher o text de um textbox por exemplo, você definir um valor padrão para a propriedade text do seu controle, obrigando o usuário a alterar este valor. O RequiredFieldValidator possue a propriedade InitialValue, o valor informado para esta propriedade será considerado inválido caso o usuário não altere.

Exemplo: Você possui um dropdownlist de Estado, onde o primeiro valor do seu dropdownlist é "Selecione um estado...", você pode informar este valor para o InitialValue do seu RequiredFieldValidator forçando o usuário a escolher outra opção.


Using the CompareValidator Control

O controle CompareValidator permite validação de comparações, usando operadores como maior ou menor para comparar entrada de dados do usuário em um ou diferentes controles.

O CompareValidator pode ser usado para validar se o tipo de dados esta correto em um controle, como por exemplo se é uma data ou um número. Para este propósito você deve definir a propriedade Type para um tipo válido que será verificado. Se o objetivo for somente verificação de dados, pode ser definida a propriedade Operator para DataTypeCheck.

A imagem abaixo mostra a janela de propriedade do controle CompareValidator. 




O CompareValidator utiliza a propriedade ValueToCompare para definir uma constante que será usada para fazer a comparação. Como exemplo, se você deseja que o usuário informe uma data superior a 1900, você deve definir a propriedade ValueToCompare para 1/1/1900 e definir a propriedade Operator, onde terá as seguintes opções: Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, ou DataTypeCheck. Neste caso deve definir GreaterThanEqual (maior ou igual que).&nbsp;


Também é possível utilizar este controle para validar duas datas, se uma é maior que a outra, ou validar se dois controles tem o mesmo valor, existe uma série de validações que podem ser criadas com o CompareValidator.


Using the RangeValidator Control


Muitas vezes temos a necessidade de validar um valor dentro de uma variação. Por exemplo, podemos querer que um campo de data seja informado com o Ano que seja o mesmo que o Ano corrente. Para este tipo de validação usamos o RangeValidator, ele possui duas propriedade principais, MinimumValue e MaximumValue, o nome delas já são bem intuitivos, outro propriedade é a Type que define qual o tipo de dados irá validar.&nbsp;

No exemplo a baixo o controle recebe o valor do ano corrente como valor máximo e 1900 como valor minimo para não permitir que o usuario informe uma data fora deste intervalo.


protected void Page_Load(object sender, EventArgs e)
{
&nbsp; if (!IsPostBack)
&nbsp; {
&nbsp;&nbsp;&nbsp; RangeValidatorSalesDate.MinimumValue = "1990";
&nbsp;&nbsp;&nbsp; RangeValidatorSalesDate.MaximumValue = DateTime.Now.Year.ToString();
&nbsp; }
}

Using the RegularExpressionValidator Control&nbsp;

Este controle efetua suas validações através de expressões regulares. Uma expressão regular é uma série de combinações de caracteres que são usadas para identificar sequências de caracteres simples ou complexas. O controle possui a propriedade ValidationExpression onde você deve informar sua expressão regular.


Expressões regulares são complexas, porém não são exigidas nesta certificação, por isso o assunto não é muito discutido. Mas em todo o caso, o visual studio possui algumas expressões regulares pré-definidas neste controle, como por exemplo, validação de endereço de e-mail ou uma url válida. Veja na imagem a baixo.


&nbsp;
The CustomValidator Control 

Apesar dos diversos controles de validação que o asp.net fornece, pode acontecer de você precisar de algum outro tipo de validação. Para estes casos, você deve utilizar o controle CustomValidator. A validação deste controle é baseada no código em que o desenvolvedor cria. Você tem a opção de utilizar a validação com javascript para rodar do lado do cliente, ou fazer via c# para rodar do lado do servidor.


Custom Client-Side Validation

Como ja falado diversas vezes, a validação do lado do cliente acontecerá bem mais rápido para quem estiver utilizando sua página.
O primeiro passo é escrever sua validação do lado cliente, você deve possui um método com a seguinte assinatura:

function ClientFunctionName(source, arguments)

Você pode renomear o método conforme sua necessidade, porém os parâmetros de entrada não podem ser modificados. Após este método ser referenciado em seu controle, o framework de valiação irá executar seu método automaticamente. Quando a função de validação for executada, o parâmetro chamado source irá conter uma referência ao controle de validação que este sendo executado. Já o parâmetro arguments tem a propriedade chamada Value que possue os dados a serem validados.


Em seguida deve escrever seu código de validação, e definir a propriedade arguments.IsValid para true ou false. E para finalizar basta definir a propriedade ClientFunctionName de seu controle, com o nome de sua função.


No exemplo a seguir, existe o seguinte cenário: você possui em sua página um controle TextBox, um botão para confirmar os dados, um ValidationSummary para exibir as mensagens de erro, e um RequiredFieldValidator para obrigar o usuário a informar uma nova senha no TextBox. Além disso tem o CustomValidator que irá fazer a seguinte validação nos dados do textbox, é um campo de senha que deve ter entre 6 e 14 caracteres, deve conter pelo menos 1 letra maiscula, uma minuscula, e pelo menos 1 número. Veja como fica o código:


&lt;%@ Page Language="VB" AutoEventWireup="false" CodeFile="NewPassword.aspx.vb" Inherits="NewPassword" %&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&nbsp;&nbsp;&nbsp; &lt;head id="Head2" runat="server"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;title&gt;Change Password&lt;/title&gt;
&nbsp;&nbsp;&nbsp; &lt;/head&gt;
&nbsp;&nbsp;&nbsp; &lt;body style="font-family: Arial"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;form id="form1" runat="server"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;div&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;table width="400"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td colspan="2" style="font-size: x-large"&gt;Change Password&lt;/td&gt;&lt;/tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;td colspan="2"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;asp:ValidationSummary ID="ValidationSummary1" runat="server" /&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/td&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;td width="190" align="right" valign="middle"&gt;New password:&lt;/td&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;td width="210" valign="middle"&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;asp:TextBox ID="NewPasswordTextBox" runat="server" TextMode="Password"&gt;&lt;/asp:TextBox&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;asp:RequiredFieldValidator ID="RequiredFieldValidatorPassword" runat="server" ErrorMessage="Please enter a valid password" text="*" ToolTip="Please enter a valid password" ControlToValidate="NewPasswordTextBox"&gt;&lt;/asp:RequiredFieldValidator&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;asp:CustomValidator ID="NewPasswordCustomValidator" runat="server" Text="*" ToolTip="Password must be between 6-14 characters and include 1 capital letter, 1 lowercase letter, and 1 number" ErrorMessage="Password must be between 6-14 characters and include 1 capital letter, 1 lowercase letter, and 1 number" ControlToValidate="NewPasswordTextBox" ClientValidationFunction="ValidatePassword"&gt;&lt;/asp:CustomValidator&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/td&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;/td&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;asp:Button ID="ButtonSubmit" runat="server" Text="Submit" /&gt;&lt;/td&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/tr&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/table&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/div&gt;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/form&gt;
&nbsp;&nbsp;&nbsp; &lt;/body&gt;
&lt;/html&gt;

O próximo passo é adicionar o código javascript com a função de validação. A função chama ValidatePassword. Observe que a assinatura do método segue o padrão mostrado anteriormente, e que como é definida o arguments.IsValid.

&lt;script language="javascript" type="text/javascript"&gt;
&nbsp;&nbsp;&nbsp; function ValidatePassword(source, arguments) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;var data = arguments.Value.split('');
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//start by setting false
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;arguments.IsValid = false;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//check length
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if(data.length &lt; 6 || data.length &gt; 14) return;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//check for uppercase, lowercase, and number
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;var uc = false; var lc = false; var num = false;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;for (var c in data) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (data[c] &gt;= 'A' &amp;&amp; data[c] &lt;= 'Z') {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;uc = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else if (data[c] &gt;= 'a' &amp;&amp; data[c] &lt;= 'z') {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;lc = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else if (data[c] &gt;= '0' &amp;&amp; data[c] &lt;= '9') {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;num = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (uc &amp;&amp; lc &amp;&amp; num) {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;arguments.IsValid = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}
&nbsp;&nbsp;&nbsp; } 
&lt;/script&gt;

Como último passo basta definir a propriedade ClientValidationFunction com o nome da função javascript, no momento do teste, assim que o foco sair do TextBox, a validação será executada.


Custom Server-Side Validation

O CustomValidador pode ser usado para validar os dados do lado do cliente, do servidor ou ambos. Para utilizar do lado do servidor, você deve utilizar o evento ServerValidate. Você associa este evento ao controle da mesma forma com que faz outros eventos de outros controles. Os parâmetros de entrada da assinatura do evento é a mesma utilizada com a validação do lado do cliente. Os parâmetros source e args. Utilizando as mesmas propriedade para definir se a valiação foi válida ou não. O código a seguir, demonstra o mesmo exemplo utilizado anteriormente.


protected void NewPasswordCustomValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
&nbsp;&nbsp;&nbsp; string data = args.Value;
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; // Start by setting false
&nbsp;&nbsp;&nbsp; args.IsValid = false;
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; // Check length
&nbsp;&nbsp;&nbsp; if (data.Length &lt; 6 || data.Length &gt; 14) return;
&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; // Check for uppercase, lowercase, and numeric
&nbsp;&nbsp;&nbsp; bool uc = false; bool lc = false; bool num = false;
&nbsp;&nbsp;&nbsp; foreach (char c in data)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (char.IsUpper(c))
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uc = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if (char.IsLower(c))
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lc = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else if (char.IsNumber(c))
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; num = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (uc &amp;&amp; lc &amp;&amp; num)
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //must be valid
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; args.IsValid = true;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
}
 
Assim encerra esta primeira lição!!