Desenvolvimento - ASP. NET

Validação de datas usando CustomValidator

Neste artigo, explicarei uma das zilhões de formas de se validar uma data utilizando o CustomValidator.

por Luiz Fernando



Galera, primeiramente quero dizer que é um prazer escrever o meu primeiro artigo para o linha de código. Muitas pessoas que programavam em asp, php e etc..., estão acostumados a desenvolver rotinas de validação via javascript ou até mesmo programando funções e procedures. Quando começam a aprender .net como eu, estudam que há uma forma pronta para validação dos dados, porém acabam não usando, pois estão acostumados a programar a validação e não a chamar algo pronto e possa ser praticamente "configurável".

Neste artigo, explicarei uma das zilhões de formas de se validar uma data utilizando o CustomValidator. Caso você precise entender mais sobre asp .net validator, aconselho que procure outros artigos com o foco no assunto. Vamos lá então!

1° Adicione o código abaixo no seu webform:

<asp:TextBox ID="txtDataNascimento" runat="server" MaxLength="10" />

<asp:RequiredFieldValidator ID="rfvtxtDataNascimento" runat="server" Text="*" ErrorMessage="O campo Data de Nascimento está vazio." Display="Dynamic" ControlToValidate="txtDataNascimento">

</asp:RequiredFieldValidator>

<asp:CustomValidator ID="ctvtxtDataNascimento" runat="server" ErrorMessage="Data inválida" ControlToValidate="txtDataNascimento"

Text="*" OnServerValidate="ValidateDate"></asp:CustomValidator>

<br />

<asp:Button ID="btnProximoView1" runat="server" Text="testar" />



2° Adicione o método que o Custom Validator irá chamar

    /// <summary>

    /// Validar uma data

    /// </summary>

    /// <param name="source"></param>

    /// <param name="args"></param>

    public void ValidateDate(object source, ServerValidateEventArgs args)

    {

        DateTime dt;

        DateTime dtNascimentoMax = DateTime.Now.AddYears(-18);

        DateTime dtMax = DateTime.Parse("1/1/1973 12:00:00");

        if (DateTime.TryParse(args.Value, out dt) == false)

            args.IsValid = false;

        //Valida se é maior de idade

        if (dt >= dtNascimentoMax)

            args.IsValid = false;

        //Valida a data para não dar SqlDateTime overflow       

        if (dt <= dtMax)

            args.IsValid = false;

    }

Explicando o código passo a passo:

-  Criado o textbox que será digitado a data.

<asp:TextBox ID="txtDataNascimento" runat="server" MaxLength="10" />

- RequiredFieldValidator, foi adicionado para validar se foi digitado algo ou se o campo está vazio.

<asp:RequiredFieldValidator ID="rfvtxtDataNascimento" runat="server" Text="*" ErrorMessage="O campo Data de Nascimento está vazio." Display="Dynamic" ControlToValidate="txtDataNascimento">

</asp:RequiredFieldValidator>

- É o validador que chama o método ValidateDate, que valida se a data digitada realmente é uma data

<asp:CustomValidator ID="ctvtxtDataNascimento" runat="server" ErrorMessage="Data inválida" ControlToValidate="txtDataNascimento"

Text="*" OnServerValidate="ValidateDate"></asp:CustomValidator>

<br />

<asp:Button ID="btnProximoView1" runat="server" Text="testar" />

- Declarando o método sem retorno, com os parâmetros padrões, que seria o objeto que disparou o evento que seria o customvalidador e o argumento.

    public void ValidateDate(object source, ServerValidateEventArgs args)

    {

    

      - irá manter a data digitada.

        DateTime dt;

      - irá manter a data mínima para verificar se é maior ou menor de 18 anos

        DateTime dtNascimentoMax = DateTime.Now.AddYears(-18);

- irá manter a data mínima existente, pois caso você tente cadastrar uma data inferior a esta em um banco por exemplo Sql Server, será gerado uma Exceção. SqlDateTime overflow. ... SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

        DateTime dtMax = DateTime.Parse("1/1/1973 12:00:00");

- O método TryParse da classe DateTime, validada se aquela string é uma data. Se for uma data ele retorna true, caso contrário retorna false.

Funciona da seguinte maneira:

         O TryParse, recebe dois parâmetros, o primeiro é a string que será convertida em DateTime e verificado se é uma data ou não, e o segundo que é um parâmetro de saída do tipo DateTime, que será a data que o método retorna.

         Para finalizar a validação, eu fiz um if. Se o método retornar false, eu chamo a propriedade IsValid da classe ServerValidateEventArgs que irá receber false caso a data não seja válida.

        if (DateTime.TryParse(args.Value, out dt) == false)

            args.IsValid = false;

        //Valida se é maior de idade

        if (dt >= dtNascimentoMax)

            args.IsValid = false;

        //Valida a data para não dar SqlDateTime overflow       

        if (dt <= dtMax)

            args.IsValid = false;

    }

Bom gente então é isso, espero ter ajudado a comunidade com este artigo.

Qualquer dúvida, mande um e-mail para luizfcs00@gmail.com.

Abraços []`s !!!

TryParse: http://msdn2.microsoft.com/en-us/library/ch92fbc1.aspx

Referência: http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.servervalidateeventargs.aspx

Luiz Fernando

Luiz Fernando