Inquiridor
RangeValidator - Problemas com validação de datas

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
Todas as Respostas
-
-
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 -
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.
[]'sDennes
*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