Adicionando um validador dinâmico a página
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 ;).
.png)
1 comentários:
Gostei do exemplo. Muito prático e útil. Parabens