Adicionando um validador dinâmico a página

06:02 , 1 Comments

Muitas vezes precisamos criar um validador no Asp.Net que não está ligado a nenhum controle, apenas valida uma regra de negócio específica da área que estamos trabalhando. Neste post montei um pequeno exemplo de como fazer isso.

O primeiro passo é criar uma classe que estenda a classe abstrata System.Web.UI.WebControls.BaseValidator e também implementar a interface System.Web.UI.IValidator conforme abaixo:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;


public class DynamicValidator : BaseValidator, IValidator
{
    //Declaração do Delegate que define a assinatura do método que irá fazer a validação.
    //Para fins de exemplo(preguiça :P) não foi seguido o padrão de usar a assinatura "object sender, EventArgs e" 
    public delegate void DynamicValidatorDelegate(out Boolean IsValid);

    //Declarando o evento que irá guardar o método de validação
    public event DynamicValidatorDelegate OnValidate;

    //Implmentando o método Validate da interface IValidator. 
    //A classe BaseValidator já implementa a interface IValidator, porém se você não reimplementa este método é 
    //lançado exceção quando ele tenta achar o ControlToValidate para poder chamar o método internamente.
    void IValidator.Validate()
    {
        Boolean IsValid;
        OnValidate(out IsValid);
        this.IsValid = IsValid;
    }

    //Este método é obrigatório sobrescrever uma vez que a classe BaseValidator é abstrata.
    protected override Boolean EvaluateIsValid()
    {
        Boolean IsValid;
        OnValidate(out IsValid);
        return IsValid;
    }

}

Observe que na classe foi declarado um evento chamado OnValidate. Este evento deve ser populado com o método quer irá fazer a validação.

Outro ponto é que se você espera que a mensagem seja exibida em algum ValidationSummary da página a propriedade ValidationGroupdeve ser preenchida, do contrário não será exibido nada que indique ao seu usuário o erro.

Agora vamos usar o validador. Para isso imagine que você tem uma página com uma regra de negócio onde um botão só pode ser acionado das 22 horas até às 23. Abaixo veja o .aspx desta página:


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary ID="vsTeste" runat="server" ValidationGroup="RegraDinamica" />
        <asp:Button ID="Button1" runat="server" Text="Validar" 
            onclick="Button1_Click" />    
    </div>
    </form>
</body>
</html>

Agora dentro do evento deste botão vamos instanciar nossa classe e adiona-la a página conforme abaixo:

using System;
using System.Web.UI;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        DynamicValidator validador = new DynamicValidator();

        //Coloco o validador no mesmo ValidationGroup do meu ValidationSummary
        validador.ValidationGroup = "RegraDinamica";

        //Preencho a mensagem de crítica que eu quero exibir caso a validação não passe
        validador.ErrorMessage = "Esta operação só pode ser realizada das 22:00 horas até as 23:00.";

        //Defino o método que irá fazer a validação, neste caso o ValidarHorario que está declarado mais abaixo
        validador.OnValidate += ValidarHorario;

        //Adiciono o validador a página
        Page.Validators.Add(validador);

        //Chamo a validação no ValidationGroup em que o validador está
        Page.Validate("RegraDinamica");
        if (Page.IsValid)
        {
            //Excuto código aqui
        }
    }

    //Método utilizado para validar o horário, como não é possivel retornar valor em eventos então é necessário 
    //utilizar a técnica de passar a variável como parâmetro usando o out
    public void ValidarHorario(out Boolean IsValid)
    {
        //Valido se a data atual está entre as 22 horas e as 23 horas, apenas fins para teste
        IsValid = (DateTime.Now.Hour > 22 && DateTime.Now.Hour < 23);
    }
}

Só uma dica: pense que través dessa técnica você pode colocar a validação dentro de sua camada de negócio ;).

Download do exemplo

1 comentários:

Unknown disse...

Gostei do exemplo. Muito prático e útil. Parabens