Jump to content
Sign in to follow this  
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?

Share this post


Link to post
Share on other 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. ;)

  • +1 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Rodrigo5468
      Boa tarde a todos.
       
      Estou desenvolvendo um sistema de registro para fins de estudos, mas tenho algumas dúvidas e dificuldades até. Estou usando "programação orientada a objetos", e quero validar alguns campos do meu registro, se puderem me auxiliar, será de grande ajuda.
       
      Meu Diretório:
      Projeto1/ ├── backend/ │ ├── classes/ │ │ ├── Register.php ├── index.php Em Register.php tenho o seguinte código para fazer a validação, mas acredito que estou fazendo algo de errado.
      public function setUsername($username) { $sql = "SELECT * FROM $this->table WHERE username = :username"; $stmt = Database::prepare($sql); $stmt->execute(array('username' => $_POST["username"])); if(empty($_POST["username"])) { return "O campo usuário não pode ser vázio."; }elseif(ctype_space($_POST["username"])) { return "Não pode usar apenas espaços no campo de usuário."; }elseif(strlen($_POST["username"] < 3)) { return "É necessário no mínimo 3 (três) caracteres no usuário."; }elseif(strlen($_POST["username"] > 15)) { return "O máximo é de 15 (quinze) caracteres no usuário."; }elseif(preg_match("/^[a-zA-Z0-9]*$/", $_POST["username"] == 0)) { return "O nome de usuário só pode conter letras e números. (sem espaços e sem caracteres epeciais)"; }elseif($stmt->num_rows !== 0) { return "O nome de usuário já está cadastrado em nossos bancos de dados."; }else { $this->username = $username; } } E no index.php tenho o seguinte código, acredito que está certo, mas eu gostaria de mostrar as mensagens de erros que estão no Register.php, como que posso fazer isso?
      $register = new Registers(); if(isset($_POST["cadastrar"])) { $username = $_POST["username"]; $email = $_POST["email"]; $password = $_POST["password"]; $register->setUsername($username); $register->setEmail($email); $register->setPassword($password); if($register->insert()) { return "Usuário cadastrado com sucesso."; } }  
       
      Obrigado pela atenção!
    • By unnie
      Se alguém estiver lendo, olá! Estou tentando fazer um CRUD e na parte de validação do e-mail, eu recebo um email tudo certinho, entretanto não estou conseguindo fazer o update de um campo do BD que corresponde ao id que informa se o e-mail está verificado ou não ...
       
      O código de verificação de e-mail está abaixo:
      <?php include "dbh.inc.php"; $token = $_GET['token']; $email = $_GET['email']; $idEmail = 1; $sql = "SELECT * FROM users WHERE emailUsers=? AND token=?"; $stmt = mysqli_stmt_init($conn); if(!mysqli_stmt_prepare($stmt, $sql)){ echo"".$email; header("Location: ../header.php?error=sqlerror"); exit(); } else{ mysqli_stmt_bind_param($stmt, "ss", $email, $token); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if($row = mysqli_fetch_assoc($result)){ ############################################################################################## $sql = "UPDATE users SET emailConfirm='$idEmail' WHERE emailUsers='$email' AND token='$token'"; $stmt = mysqli_stmt_init($conn); mysqli_stmt_execute($stmt); echo "".$row['emailConfirm'].$row['emailUsers'].$row['token'].$row['']; ############################################################################################## } if(!mysqli_stmt_affected_rows()>0){ echo"Afetou Linhas"; } else{ echo"Nenhuma Linha Afetada"; } } no e-mail contém um link estilo:
       
      site.com/arquivo.php?email=$email&token=$token
      site.com/arquivo.php?email=oemaildousuario&token=tokendousuario
       
      quando peço que faça o 'echo' do token e e-mail, é imprimido na tela o email e token que estão no link corretamente como eu quero e quando peço 'echo' de outra informação do usuário que contem as informações equivalentes ao do token e email do link as informações são mostradas corretamente também, mas no momento que peço pelo UPDATE nada acontece no BD, o id de validação (emailConfirm) de e-mail continua em '0'  e não faz o update para 1...
       
      alguém pode me ajudar???  Obrigada !
    • By vonder
      Preciso de validar os campos do "CRIAR LOGIN";
      Armazenar informações em alguma variável ao clicar no botão CADASTRAR; (não pode usar banco de dados)
      validar campos do "LOGIN";
      permitir acesso ao LOGIN se as informações forem iguais as inseridas no CRIAR LOGIN;
       
      Se conseguirem armazenar os cadastros em algum vetor ajudaria dms!

    • By ndias
      <!DOCTYPE html> <head> <meta charset="utf-8"> <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <form name="form" action="" method="post" data-toggle="validator" role="form"> <div class="row"> <div class="help-block with-errors"></div> <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12"> <input type="text" placeholder="CPF" name="CPF" data-error="Por favor, informe seu CPF." required> </div>   <input type="submit" value="Cadastrar" />   </div> </form> <!--jQuery--> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <!--Bootstrap--> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script> <!--validator--> <script src="js/validator.min.js"></script> </body> </html>  
    • By Camille Roberta
      Olá,
       
      estou tendo dificuldades para criar o código de validação de um formulário que abrirá em um popup, o código fica se repetindo causando erro (o erro aparece na tela repetidamente de forma que não é possível preencher os campos). Peço gentilmente a ajuda de vocês.
       
      Código HTML:
       
      <HTML>
             <HEAD>
                        <link rel="stylesheet" href = "css/stylesheet1.css">
             </HEAD>
             <BODY>
      <!-- popup -->
             <div id = "popup" class = "popup">
                     <a>x</a>
                     <h3><center>Inscreva-se em nossa newsletter</center></h3>
                     <p><center>Cadastre-se e fique por dentro de nossos eventos e promoções!</center></p>
                           <form class="form" method= "get" name = "modal_form" onSubmit="return ( verifica() )">
                                <input id="name" name = "nome" type="text" placeholder="NOME" onblur="checar();" />
                                <input id="email" name = "email" type="text" placeholder="nome@email.com" onblur="checar();" />
      <br>
                               <span class = "nao_valido">Email Inválido</span>
      <br>
                               <input id="submit" type="submit" value="Enviar">
      </form>
              <br>
              </div>
       
      Código Javascript
       
      setTimeout(ApresentarPopup, 4000);
      function ApresentarPopup(){
              document.querySelector(".popup").style.display = "block";
              document
                  .querySelector(".popup a")
                  .addEventListener("click", function(){ document.querySelector(".popup").style.display = "none";
                  });
          }
      //validação
      function verifica() {
        if (document.forms[0].email.value.length == 0) {
          alert("Por favor, informe o seu e-mail.");
          document.modal_form.email.focus();
          return false;
        }
        return true;
      }

      function checar(){
          if( document.forms[0].email.value=="" 
              || document.forms[0].email.value.indexOf('@')==-1 
              || document.forms[0].email.value.indexOf('.')==-1 )
             {
              alert( "Por favor, informe um e-mail válido." );
              return false;
          }
          
          if (document.forms[0].nome.value == ""){
              alert ("Por favor, informe seu nome");
              return false;
          }
      }
                   <script type="text/javascript" src="js/script.js"></script>
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.