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 ;).
1 comentários:
Gostei do exemplo. Muito prático e útil. Parabens