none
RangeValidator - Problemas com validação de datas RRS feed

  • Pergunta

  • Bom dia Pessoal

    estou tentando utilizar o rangeValidator mas estou com alguns problemas. Se alguém puder me ajudar agradeço.
    Trabalho com uma aplicação web e utilizo o C#. Gostaria de validar o período que um usuário indica para gerar um relatório. Tenho então dois textbox com marcara e calendarextender associado. Para o txtDtInicio defini que a menor data deve ser a data minima existente e a maior data deve ser no máximo a data de hoje. Para o txtDtFim defini que a data mínima deve ser a data mínima definida no txtDtInicio e a data máxima a data de hoje. Como não consegui definir diretamente nas propriedades MaximumValue a data atual (utilizando o Now) coloquei no Page_load o seguinte codigo:

    //Preparando dados para validacao

    rgvDtInicio.MinimumValue = DateTime.MinValue.ToShortDateString();
    rgvDtInicio.MaximumValue =
    DateTime.Now.ToShortDateString();
    rgvDtFim.MinimumValue =
    DateTime.MinValue.ToShortDateString();
    rgvDtFim.MaximumValue =
    DateTime.Now.ToShortDateString();

    //Para atualizar o rgvDtFim.MinimumVlue com a data do txtDtInicio depois que o usuário informa a data inicial, tive que ativar o postback no txtDtInico e inseri o evento:
    protected void txtDtInicio_TextChanged(object sender, EventArgs e)
    {  
    if ((Convert.ToDateTime(txtDtInicio.Text) <= DateTime.Now))
            rgvDtFim.MinimumValue = txtDtInicio.Text;
    }

    <%-- Define validacao --%>

    <asp:RangeValidator ID="rgvDtInicio" runat="server"
       ControlToValidate="txtDtInicio" Type="String"
       ErrorMessage="Data que in¡cia o per¡odo deve ser igual ou menor que a data atual"
       Display="None" SetFocusOnError="True"
       ondatabinding="rgvDtInicio_DataBinding"></asp:RangeValidator>
    <AjaxToolKit:ValidatorCalloutExtender ID="vceDtInicio" runat="server"
       TargetControlID="rgvDtInicio" HighlightCssClass="validacaoObjeto" />

     

    Problemas encotrados: Ao digitar no txtDtInicio uma data acima de hoje, aparece  a mensagem de erro, porém ao ocorrer o postback a mesagem de erro some. Então tirei o postback e fiz o teste novamente. A mensagem de erro apareceu mas mesmo depois que eu digitei a data correta e acionei o tab, a mensagem continua e além disso tive que acionar o tab 3 vezes para poder mudar para o outro objeto. Se eu nao colocar a data correta e acionar o tab 3 vezes ele muda de objeto tb sem problema (sendo que nao deveria permitir).

    Alguém teria alguma sugestão?

    Preciso validar a data e manter o foco no mesmo objeto até que insira uma data valida. Além disso, preciso alterar o valor mínimo da DtFim após ser definido a DtInicial valida.

    Obrigada



    Patricia
    segunda-feira, 6 de abril de 2009 14:20

Todas as Respostas

  • Esta propriedade do RangeValidator ,  Type="String"  não deveria ser Type="Date" ou Type="DateTime"

    Bruno Gallego - Se este poste foi útil, por favor, classifique MCP - MCTS - MCDBA - MCPD.NET
    terça-feira, 7 de abril de 2009 20:51
  • Olá pessoal

    então Bruno eu fiz essa alteração tb mas continuo com alguns problemas. Se puder me ajudar :) .

    Alterei a propriedade Type do RangeValidator para Type="Date". A validação estava funcionando mas ainda é possível navegar para outros objetos mesmo a data estando incorreta. A mensagem de erro muitas vezes some. Então inclui o ValidationGroup para que mesmo se o usuário nao arrumar a data, ao clicar no botão (que tb esta com o ValidationGroup) não permita a execução até a data seja arrumada. Então o código ficou dessa forma:

     


    <%-- Define validacao --%>
    <asp:Label ID="lblPeriodo" runat="server" Text="Período" CssClass="Fonte"/>
    <%-- Data inicial --%>
    <asp:TextBox ID="txtDtInicio" runat="server" CssClass="Fonte" 
            ontextchanged="txtDtInicio_TextChanged" CausesValidation="True" 
            AutoPostBack="True" ValidationGroup="ValidaData" />
    <%-- Associa o calendário ao texbox --%>
    <AjaxToolKit:calendarextender ID="calExtDtInicio" runat="server" 
            TargetControlID="txtDtInicio" Format="dd/MM/yyyy" Enabled="False" />
    <%-- Define uma mascara para o textbox--%>
    <AjaxToolKit:maskededitextender ID="mskExtDtInicio" runat="server" 
             TargetControlID="txtDtInicio" MaskType="Date" Mask="99/99/9999" 
             ErrorTooltipEnabled="true" MessageValidatorTip="true"
                   />
    <%--Indica se data esta inválida --%>
    <AjaxToolKit:MaskedEditValidator ID="mskValDtInicio" runat="server"
            ControlExtender="mskExtDtInicio" 
            ControlToValidate="txtDtInicio" InvalidValueMessage="Data Inválida"
            ValidationGroup="ValidaData"/>
       
    <asp:RangeValidator ID="rgvDtInicio" runat="server" 
            ControlToValidate="txtDtInicio" Type="Date"
            ErrorMessage="Data que inícia o período deve ser igual ou menor que a data atual" 
            Display="None" SetFocusOnError="true" 
            ValidationGroup="ValidaData"></asp:RangeValidator>
    <%-- Exibe mensagem do RangerValidator em balão --%>
    <AjaxToolKit:ValidatorCalloutExtender ID="vceDtInicio" runat="server"
            TargetControlID="rgvDtInicio" HighlightCssClass="validacaoObjeto" />

    Ao realizar um teste, apresentou erro. Segue o teste que eu fiz tomando como base a data de hoje = 08/04/2009

    1) Na primeira data coloco uma data errada (ex:15/04/2009)  e aciono a tecla tab. O erro de validação é apresentado. Ao acionar tab novamente consigo ir para a proxima data e a mensagem de erro continua aparecendo. Também escolho para a 2.ª data uma data errada (ex:09/04/2009) e agora a mensagem de erro aparece na 2.ª data. (mas manter a primeira data em negrito). Altero a 2.ª data para uma data correta porém menor do que a 1.ª data (ex: 03/04/2009, dessa forma continua aparecendo o erro na 2.ª data pois ela nao pode ser menor que a primeira).
    Retorno para a primeira data e insiro uma data correta (ex: 01/04/2009).
    Dessa forma as duas datas agora estão corretas.
    Problema: A segunda data (03/04/2009) continua apresentando o erro.
    MOtivo: Não passou pelo evento TextChanged e por isso não validou o RangerValidator da 2.ª data.

    Dúvida: Pq algumas vezes o evento TextChanged dispara e outras vezes  não. Já repeti esse processo de troca de datas em varios testes e hora o evento TextChanged ocorre e outras vezes não. Alguém teria alguma sugestão ?

    Duvida2: Tem como não permitir a navegação para outros objetos enquanto não validar ?

    Obrigada

    T+


     


    Patricia
    quarta-feira, 8 de abril de 2009 17:44
  • Oi,

    A questão é que um autopostback tipicamente não provoca validações. Os erros até são exibidos mas "depois somem" como você mesmo descreveu.

    Some a isso o fato de que não é padrão dos validadores web prenderem o usuário em um campo. Os validadores web exibem o erro e evitam que o click no botão final ocorra (evitam o post do botão), mas o usuário não fica preso a um único campo.

    Primeiramente, desligue o causesvalidation da primeira textbox. O causesvalidation provoca a validação de tudo e não só do valor da textbox, isso pode gerar problemas.

    Minha sugestão é alterar o código do txtDtInicio_TextChanged. Veja como pode ser feito :

    protected void txtDtInicio_TextChanged(object sender, EventArgs e)
    {   
      rgvDtInicio.Validate();
      if (rgvDtInicio.isValid())
          if ((Convert.ToDateTime(txtDtInicio.Text) <= DateTime.Now))
               rgvDtFim.MinimumValue = txtDtInicio.Text;
    }

    Fazendo isso você provoca a execução do validador e só faz a alteração do validador seguinte se o validador atual estiver válido. Se ("Se") o setfocusonerror, além de definido como true no validador rgvDtInicio, estiver funcionando corretamente (algumas coisas não funcionam bem quando o erro é encontrado no servidor) então o usuário vai ser jogado para a caixa de data e talvez (apenas talvez) fique relativamente preso nela.

    Se desejar intensificar a "prisão" do usuário no campo data, pode trabalhar habilitando e desabilitando campos, apenas habilitar o campo da 2a data quando o campo da primeira data estiver preenchido corretamente.

    []'s

    Dennes
    *Treinamento de ASP.NET 3.5 em SP : Apenas 12xR$ 70,88 - http://www.bufaloinfo.com.br/cursos/aspnet2.asp

     


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    quinta-feira, 21 de maio de 2009 03:39