Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rafaelbh

Como utilizar dois "Custom Validator" na mesma página? C#

Recommended Posts

Pessoal,

 

tenho uma WebForm com um Formview e preciso validar alguns campos utilizando o Custom Validator.

 

em um validador, vou fazer comparação se já existe determinado usuário cadastrado no banco de dados utilizando um textbox de nome completo e um textbox de apelido. não tenho campo de cpf. (esse validador já está funcionando).

 

porém, preciso fazer uma validação de data e hora inicial ser menor ou igual à data e hora final e consigo usar o validador sem problemas em uma outra página.

 

meu problema é que, agora, tenho uma única página em que tenho que fazer essas comparações.

queria usar dois Custom Validator nessa tela, mas não sei como usar.

 

tenho uma função javascript para o lado cliente:

function DataValidator_ClientValidate(source,
                                      clientside_arguments) {
            clientside_arguments.IsValid = false;

            jQuery.ajax({
                type: "POST",
                async: false,
                url: "detContato.aspx/IsDataValid",
                data: "{Contato: '" + clientside_arguments.Value + "', ContatoCompleto: '" + $("[id*=tbxContatoCompleto]").val() + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    clientside_arguments.IsValid = msg.d;
                },
                error: function (msg) {
                    clientside_arguments.IsValid = false;
                }
            });

            return clientside_arguments.IsValid;

além da função javascript, tenho o validator associado ao meu campo txbContato:

<asp:CustomValidator ID="DataValidator" runat="server" ClientValidationFunction="DataValidator_ClientValidate" ControlToValidate="tbxContato" Display="None" ErrorMessage="Esse Contato já existe!" meta:resourcekey="DataValidatorResource1" OnServerValidate="DataValidator_ServerValidate" SetFocusOnError="True" ValidationGroup="valgroup" />
                                    <ajaxtoolkit:ValidatorCalloutExtender ID="DataValidatorE" runat="server" CloseImageUrl="~/Layout/Imagens/close_12x12.png" CssClass="customCalloutStyle" PopupPosition="BottomRight" TargetControlID="DataValidator" WarningIconImageUrl="~/Layout/Imagens/excl.png" />

e, no arquivo .cs tenho os métodos:

protected void btnGravar_Click(object sender, EventArgs e)
    {
        if (IsValid)
        {
            // bla bla bla
        }
        else
        {
            ((CustomValidator)FormView1.FindControl("DataValidator")).IsValid = false;
        }
    }

public static bool IsDataValid(string Contato, string ContatoCompleto)
    {
        try
        {

            SqlConnection conex = DBUtils.CreateConnection();
            SqlCommand cmd = new SqlCommand();

            string cod = null;
            int result = 0;

            //Pega a QueryString no método do tipo static
            NameValueCollection collection = GetQueryStringCollection(HttpContext.Current.Request.UrlReferrer.Query);
            if (collection != null && collection.Count > 0)
            {
                cod = HttpContext.Current.Server.UrlDecode(collection["cod"]);
            }

            if (cod == "0")
            {
                result = Queries.selectValidaContato(Contato, ContatoCompleto);
            }
            else if (cod != "0")
            {
                result = Queries.selectValidaContato(Contato, ContatoCompleto, cod);
            }

            if (result == 0)
                return true;
            else
                return false;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    protected void DataValidator_ServerValidate(object sender, ServerValidateEventArgs e)
    {
        e.IsValid = IsDataValid(e.Value, ((TextBox)FormView1.FindControl("tbxContatoCompleto")).Text);
    }

 

Não sei como utilizar os dois validadores na mesma página.

Já tentei alterar o nome dos métodos/funções, mas não funcionou como deveria.

Acredito que seja por causa do "IsValid", que não tenho nem ideia de como diferenciá-lo de acordo com o validador.

Não sei se fui muito claro em minha dúvida, mas é: basicamente como utlizar dois custom validator na mesma página?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Resolvido.


Coloquei um if para pegar o controle a ser validado:




function DataValidator_ClientValidate(source,
clientside_arguments) {
clientside_arguments.IsValid = false;
if (Page_Validators.controltovalidate == document.getElementById("tbxContato")) {
jQuery.ajax({
type: "POST",
async: false,
url: "detContato.aspx/IsDataValid",
data: "{Contato: '" + clientside_arguments.Value + "', ContatoCompleto: '" + $("[id*=tbxContatoCompleto]").val() + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
clientside_arguments.IsValid = msg.d;
},
error: function (msg) {
clientside_arguments.IsValid = false;
}
});
}
if (Page_Validators.controltovalidate == document.getElementById("ddlHoraFimInsert")) {
jQuery.ajax({
type: "POST",
async: false,
url: "detContato.aspx/IsDataValid_DATAHORA",
data: "{HoraFim: '" + clientside_arguments.Value + "', HoraInicio: '" + $("[id*=ddlHoraInicioInsert]").val() + "', DataInicio: '" + $("[id*=tbxDataInicioInsert]").val() + "', DataFim: '" + $("[id*=tbxDataFimInsert]").val() + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
clientside_arguments.IsValid = msg.d;
},
error: function (msg) {
clientside_arguments.IsValid = false;
}
});
};

//if (Page_Validators.controltovalidate == document.getElementById("ddlHoraInicioInsert")) {
//jQuery.ajax({
// type: "POST",
// async: false,
// url: "detContato.aspx/IsDataValid_DATAHORA",
// data: "{HoraFim: '" + clientside_arguments.Value + "', HoraInicio: '" + $("[id*=ddlHoraInicioInsert]").val() + "', DataInicio: '" + $("[id*=tbxDataInicioInsert]").val() + "', DataFim: '" + $("[id*=tbxDataFimInsert]").val() + "'}",
// contentType: "application/json; charset=utf-8",
// dataType: "json",
// success: function (msg) {
// clientside_arguments.IsValid = msg.d;
// },
// error: function (msg) {
// clientside_arguments.IsValid = false;
// }
//});

return clientside_arguments.IsValid;
}



Porém, preferi criar duas funções com nomes diferentes.




function DataValidator_ClientValidate(source,
clientside_arguments) {
clientside_arguments.IsValid = false;

jQuery.ajax({
type: "POST",
async: false,
url: "detContato.aspx/IsDataValid",
data: "{Contato: '" + clientside_arguments.Value + "', ContatoCompleto: '" + $("[id*=tbxContatoCompleto]").val() + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
clientside_arguments.IsValid = msg.d;
},
error: function (msg) {
clientside_arguments.IsValid = false;
}
});

return clientside_arguments.IsValid;
}
function DataValidator_ClientValidate_DATAHORA(source,
clientside_arguments) {
clientside_arguments.IsValid = false;
jQuery.ajax({
type: "POST",
async: false,
url: "detContato.aspx/IsDataValid_DATAHORA",
data: "{HoraFim: '" + clientside_arguments.Value + "', HoraInicio: '" + $("[id*=ddlHoraInicioInsert]").val() + "', DataInicio: '" + $("[id*=tbxDataInicioInsert]").val() + "', DataFim: '" + $("[id*=tbxDataFimInsert]").val() + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
clientside_arguments.IsValid = msg.d;
},
error: function (msg) {
clientside_arguments.IsValid = false;
}
});
return clientside_arguments.IsValid;
}



coloquei os dois custom validators:



<asp:CustomValidator ID="DataValidator" runat="server" ClientValidationFunction="DataValidator_ClientValidate" ControlToValidate="tbxContato" Display="None" ErrorMessage="Esse Contato já existe!" meta:resourcekey="DataValidatorResource1" OnServerValidate="DataValidator_ServerValidate" SetFocusonerror="True" ValidationGroup="valgroup" />
<ajaxtoolkit:ValidatorCalloutExtender ID="DataValidatorE" runat="server" CloseImageUrl="~/Layout/Imagens/close_12x12.png" CssClass="customCalloutStyle" PopupPosition="BottomRight" TargetControlID="DataValidator" WarningIconImageUrl="~/Layout/Imagens/excl.png" />
<asp:CustomValidator ID="DataValidator_DATAHORA" runat="server" ClientValidationFunction="DataValidator_ClientValidate_DATAHORA" ControlToValidate="ddlHoraFimInsert" Display="None" ErrorMessage="Hora Fim deve ser maior que Hora Início!" meta:resourcekey="DataValidatorResource1_DATAHORA" OnServerValidate="DataValidator_ServerValidate_DATAHORA" SetFocusonerror="True" ValidationGroup="valgroup" />
<ajaxToolkit:ValidatorCalloutExtender ID="DataValidatorE_DATAHORA" runat="server" CloseImageUrl="~/Layout/Imagens/close_12x12.png" CssClass="customCalloutStyle" TargetControlID="DataValidator_DATAHORA" WarningIconImageUrl="~/Layout/Imagens/excl.png" PopupPosition="BottomLeft" />



e meu codebehind ficou assim:




[System.Web.Services.WebMethod(Description = "Verifica se o dado já está cadastrado.")]
public static bool IsDataValid(string Contato, string ContatoCompleto)
{
try
{

SqlConnection conex = DBUtils.CreateConnection();
SqlCommand cmd = new SqlCommand();

string cod = null;
int result = 0;

//Pega a QueryString no método do tipo static
NameValueCollection collection = GetQueryStringCollection(HttpContext.Current.Request.UrlReferrer.Query);
if (collection != null && collection.Count > 0)
{
cod = HttpContext.Current.Server.UrlDecode(collection["cod"]);
}

if (cod == "0")
{
result = Queries.selectValidaContato(Contato, ContatoCompleto);
}
else if (cod != "0")
{
result = Queries.selectValidaContato(Contato, ContatoCompleto, cod);
}

if (result == 0)
return true;
else
return false;
}
catch (Exception ex)
{
throw ex;
}
}

protected void DataValidator_ServerValidate(object sender, ServerValidateEventArgs e)
{
e.IsValid = IsDataValid(e.Value, ((TextBox)FormView1.FindControl("tbxContatoCompleto")).Text);
}

[System.Web.Services.WebMethod(Description = "Verifica se a data/hora início é menor que a data/hora fim.")]
public static bool IsDataValid_DATAHORA(string HoraFim, string HoraInicio, string DataInicio, string DataFim)
{
try
{

SqlConnection conex = DBUtils.CreateConnection();
SqlCommand cmd = new SqlCommand();

string cod = null;

//Pega a QueryString no método do tipo static
NameValueCollection collection = GetQueryStringCollection(HttpContext.Current.Request.UrlReferrer.Query);
if (collection != null && collection.Count > 0)
{
cod = HttpContext.Current.Server.UrlDecode(collection["cod"]);
}

if (Convert.ToDateTime(DataInicio) == Convert.ToDateTime(DataFim))
{
if (Convert.ToInt16(HoraInicio) > Convert.ToInt16(HoraFim))
{
return false;
}
else
{
return true;
}
}
else
{
return true;
}
}
catch (Exception ex)
{
throw ex;
}
}

protected void DataValidator_ServerValidate_DATAHORA(object sender, ServerValidateEventArgs e)
{
e.IsValid = IsDataValid_DATAHORA(e.Value, ((DropDownList)FormView1.FindControl("ddlHoraInicioInsert")).SelectedValue, ((TextBox)FormView1.FindControl("tbxDataInicioInsert")).Text, ((TextBox)FormView1.FindControl("tbxDataFimInsert")).Text);
}

//Get Querystring name value collection
public static NameValueCollection GetQueryStringCollection(string url)
{
string keyValue = string.Empty;
NameValueCollection collection = new NameValueCollection();
string[] querystrings = url.Split('&');
if (querystrings != null && querystrings.Count() > 0)
{
for (int i = 0; i < querystrings.Count(); i++)
{
string[] pair = querystrings[i].Split('=');
collection.Add(pair[0].Trim('?'), pair[1]);
}
}
return collection;
}



Resumindo:

Na verdade eu tava fazendo tudo certo, só tava esquecendo de colocar no cabeçalho do método a tag do WebMethod:



[System.Web.Services.WebMethod(Description = "Verifica se a data/hora início é menor que a data/hora fim.")]



Pode fechar o tópico. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por juniormatrix
      Olá
       
      Achei esse script aqui no fórum mesmo:
       
      $.validator.addMethod( "customEmail", function (value, element) { return this.optional(element) || /^[\w-\.]+@fulano\.com\.br$/i.test(value); }, "Por favor, insira um e-mail válido com o domínio @fulano.com.br" ); $("#formulario").validate({ ignore: ".ignore", rules: { empresa: { required: true }, nome: { required: true }, contato: { required: true }, celular: { required: true }, email: { required: true, email: true, customEmail: true }, }, }); Testei e funcionou perfeitamente, mas gostaria que liberasse mais e-mails válidos, ao invés de apenas um.

      Tem como fazer? 
       
      Se alguém puder ajudar, fico muito grato.
    • Por estanieski_poa
      Estou com um sistema antigo, desenvolvido em Delphi 7+Oracle10g.
       
      O sistema funciona corretamente, mas ele começou a ficar solcititando usuário e senha do Oracle quando realizo pesquisar ou inserções no sistema.
       
      Como desativo essa solicitação?
    • Por aredienhcs
      Salve!
       
      Me deparei com uma inconsistência hoje nos validadores do Laravel. O caso é que se eu construir um FormRequest devolvendo no método rules() a seguinte regra:
      ['logradouro' => 'string|min:5'] passando o valor '' (aspas simples ) para o campo logradouro, o valor é validado corretamente, devolvendo a inconsistência com a regra de 5 caracteres.
      Porém quando eu crio um validador desta outra forma:
      $dados = [ [ 'logradouro' => ''] ]; $regras = [ ['logradouro' => 'string|min:5'] ]; $v = Validator::make( $dados, $regras); dd( $v->fails()); A mesma regra passa batida pelo validador, retornando 'false' no 'fails( )' do validador. Gostaria de entender porque existe essa diferença entre os dois métodos de validação, e sem tem alguma forma de corrigir esse comportamento.
      Se for preciso mais informações a respeito posso exemplificar melhor.
       
      []s
    • Por fideles
      Fala pessoal, tudo na paz? Como anda a quarentena ? Todos se cuidando....
       
      Seguinte, uma dúvida ou navalhada minha,
       
      Tenho um form simples, básico mesmo onde trampo, só para fazermos levantamento quando alguém chega.
       
      Nome da pessoa
      Um regime de contratação (CLT ou PJ) (input do tipo radio) (Nos value dos input radio tem CLT e PJ)
      Nome da empresa (campo oculto) (aqui funciona na boa)
       
      Preciso fazer com que se a pessoa clicar em PJ fazer ela preencher obrigatoriamente o campo "Nome da empresa" se ela for CLT não faz nada.
       
      Já tentei da seguinte forma e não da certo, talvez esteja errando por bobeira.
       
      if(empty($tipo_contratacao == "PJ")) { echo "<meta http-equiv='refresh' content='0; pesquisa_retorno_2.php'><script>alert('O campo nome da empresa não foi preenchido')</script>" ; return false; }  
      Alguém tem uma luz ?
       
      Obrigado.
    • Por szLeonardo
      Olá a todos,
      Estou com um problema no meu cadastro de usuário.
      A parte de cadastrar está sendo realizada corretamente e meu login também, o meu problema está é que tenho que cadastrar em uma tela, depois entrar em outra para validar e acessar.
      Gostaria que quando eu realizasse o cadastro já valida-se e entrasse direto, sem precisar ter que entrar na outra pagina e rodar o login.
       
      Segue meu cadastro que está funcionando:  
      //--Insere Registro   if(isset($_POST['cadastrar'])){     @$usuario      = trim(strip_tags($_POST['usuario']));     @$senha        = trim(strip_tags($_POST['senha']));     @$nivel_acesso = trim(strip_tags($_POST['nivel_acesso']));     $insert = "INSERT INTO cad_usuario (usuario, senha, nivel_acesso)                 VALUES (:usuario, :senha, :nivel_acesso)";   try{     $result = $conexao->prepare($insert);     $result->bindParam(':usuario',      $usuario, PDO::PARAM_STR);     $result->bindParam(':senha',        $senha, PDO::PARAM_STR);     $result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);     $result->execute();     $contar = $result->rowCount();   if($contar>0){     echo '<div class="alert alert-success">           <button type="button" class="close" data-dismiss="alert">×</button>           <strong>Sucesso!</strong> O Usuario foi Cadastrado!</div>';          $_SESSION['autenticado'] = true;   }else{     echo '<div class="alert alert-danger">           <button type="button" class="close" data-dismiss="alert">×</button>           <strong>Erro ao cadastrar!</strong> Não foi possível cadastrar o Usuario.</div>';   }}catch(PDOException $e){     echo $e;   }}   } }  
      Segue meu validador do usuário cadastrado que está funcionando: 
      <?php session_start(); include_once "connection/conecta.php"; $usuario = new Usuario(); try {   if($usuario->confere($_POST['usuario'],$_POST['senha'])) {     $_SESSION['autenticado'] = true;     $_SESSION['usuario'] = $_POST['usuario'];     header('location: principal.php');   } else {     $_SESSION['autenticado'] = false;     include_once "index.php";     exit("<div class='alert alert-danger col-sm-12'>Usuário ou senha incorretos. Verifique</div>");   } } catch(PDOException $p){   echo "Ocorreu um erro inesperado: ". $p->getMessage(); } ?>  
      Segue minha pagina principal aonde valida a $_SESSION['autenticado'] = false; 
      Mas só valida se passar na pagina index e passar pela validação a cima.
       <?php require_once("connection/conecta.php"); ob_start(); session_start();  if (@!$_SESSION['autenticado']){    include_once "index.php";    exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");  }     $logado = $_SESSION['usuario'];     $sql = "SELECT * from cad_usuario WHERE usuario = '$logado' and situacao = 'A'";     try{       $result = $conexao->prepare($sql);         $result->execute();       $contar = $result->rowCount();                if($contar =1){         $loop = $result->fetchAll();         foreach ($loop as $show){           $userLogado  = $show['usuario'];           $senhaLogado = $show['senha'];           $nivelLogado = $show['nivel_acesso'];         }       }       }catch (PDOWException $erro){ echo $erro;} ?>  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.