none
Jquery validator com UpdatePanel e master page RRS feed

  • Pergunta

  • Boa Noite!

    Meu cenario é o seguinte:
    Criei master page com referencia ao Jquery, Jquery validator e tambem coloquei um updatePanel e script manager.
    Uma pagina(default.aspx) que contem meu formulario que será validado pelo JqueryValidator.

    O problema esta na validação, ao confirmar o formulario em um <asp button> o jquery ate faz a validacao, mas a pagina é enviada para o server. Me corrigam se estiver enganado, mas ela faz uma postback e perco a validacao.

    Para contornar este problema, peguei um exemplo deste site: http://stackoverflow.com/questions/850777/asp-net-jquery-jquery-validation-plugin-updatepanel-nyromodal-success-f

    Maravilha! ele cancela o postBack enquanto o validator retornar FALSE.
    Mas eu estou com problema, essa alternativa funciona muito bem quando se tem um unico campo, mas quando tem dois campos por exemplo, ele se perde. Se o primeiro é valido e o segundo nao, esta funcao javascript esta retornando TRUE, mas na verdade o formulario nao foi validado.

      <%-- <script type="text/JavaScript" language="JavaScript">
        function pageLoad() {
          var manager = Sys.WebForms.PageRequestManager.getInstance();
          manager.add_endRequest(endRequest);
        }
        function endRequest(sender, args) {
          //Do all what you want to do in jQuery ready function
    
          
    
        }  
    </script>--%>
    
    
    <script type="text/javascript">
      // By default, don't allow Postback until we've successfully validated our form on the client-side. 
      //var cancelPostback = true;
    
      // Every single time the page loads, including every single AJAX partial postback 
      function pageLoad() {
        // Reset the value to say that "We don't allow Postbacks at this stage".. 
        cancelPostback = true;
        alert("Carregou");
        
    
        // Attach client-side validation to the main form 
        //$("#aspnetForm").validate({ success: function () { alert('validation succeeded!'); cancelPostback = false; } });
    
        // my code validation
        $(document).ready(function() {
          $("#aspnetForm").validate({
            rules: {
              <%=txtName.UniqueID %>: {
                minlength: 2,
                required: true
              },
               <%=txtEmail.UniqueID %>: {            
                required: true,
                email:true
              }
            }, 
            messages: {
              <%=txtName.UniqueID %>:{ 
                required: "* Required Field *", 
                minlength: "* Please enter atleast 2 characters *" 
              },
              <%=txtEmail.UniqueID %>:{ 
                email: "digite um e-mail valido" 
              }
              
            },
            success: function (validate){ cancelPostback = false; }
            
          });
        });
    
        // Grab a reference to the Page Request Manager 
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_initializeRequest(onEachRequest);
    
        //alert("Page Load");
      }
    
      // Our own custom method to be attached to each new/future page request.. 
      function onEachRequest(sender, args) {
        //alert("About to cancel? " + cancelPostback);
        // Check to see if we need to Cancel this Postback based on Conditional Logic within this page.. 
        args.set_cancel(cancelPostback);
        
      } 
    </script> 

    Meus controles asp.net

     Name: <asp:TextBox ID="txtName" MaxLength="30" runat="server" /><br />
      Email: <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox><br />
      <asp:Button ID="btnSubmit" runat="server" Text="Submit" onclick="btnSubmit_Click" />
    O page load
     protected void Page_Load(object sender, EventArgs e)
      {
    
        // txtNome.Attributes.Add(" onClick ","alert('alertao');");  
        
        if (!IsPostBack ) {
          Label1.Text = "Page Aqui é not PostBack";
        }
        else
        {
          Label1.Text = "So passou pelo Page";
        }
    
        
      }

    go live
    sexta-feira, 28 de maio de 2010 00:08

Respostas

  •  

    Amigo já tive varios ambientes parecidos com o seu e funcionaram, o que você poderia fazer é "forçar" uma validação no click do botão, de uma olhada em http://docs.jquery.com/Plugins/Validation/valid

     

    No seu caso você faria assim;

     

    <asp:Button ID="btnSubmit" runat="server" CssClass="btnEnviar" Text="Submit" onclick="btnSubmit_Click" />

     

    no javascript 

     

     $(document).ready(function() {

    $(".btnEnviar").click(function() {

       $("#aspnetForm").valid();

    });

    });

     


    Se ajudou não esqueça de marcar como útil =) Alan Bruno Heil
    • Sugerido como Resposta Alan Heil sexta-feira, 28 de maio de 2010 11:47
    • Marcado como Resposta Douglas Rossetim sábado, 3 de julho de 2010 13:30
    sexta-feira, 28 de maio de 2010 11:46
  • Pessoal, consegui.
    Pra quem esta procurando algo parecido, deixo aqui o codigo criado.

    O código verifica se o formulário esta válido pelo Jquery. Caso negativo, é cancelado o postBack da pagina, evitando assim que a pagina seja enviada para o servidor.

    Voces vao notar tambem que existe uma DropDownList(ddlUF2), é um tratamento especifico para popular outra ddl (cidade).
    Qualquer duvida, ou ajuda, enviem um e-mail.
    Abraços!

    <script type="text/javascript">
    // By default, don't allow Postback until we've successfully validated our form on the client-side. 
    //var cancelPostback = true;
    
    // Every single time the page loads, including every single AJAX partial postback 
    function pageLoad() {
      // Reset the value to say that "We don't allow Postbacks at this stage".. 
      cancelPostback = true;
      // alert("pageLoad");   
    
      validateForm();
      // Attach client-side validation to the main form 
    }
    
    // Here custom method
    function validateForm(){
      // for simul event ScriptManager
      $(document).ready(function () {
    
        /*
        Here you can define own object dropDownList, for examples: 
        Object: $("#<%=ddlUF2.UniqueID %>").change(function () ...
        style: $(".cboPostBack").change(function () {
        */
        $(".cboPostBack").change(function () {
    
          //alert("change event for <your object>");
          cancelPostback = false;
    
          // Grab a reference to the Page Request Manager 
          //var prm = Sys.WebForms.PageRequestManager.getInstance();
          //prm.add_initializeRequest(onEachRequest);
          GrabPageRequestManager();
    
        });
    
        // Here Define your form for validate
        $("#aspnetForm").submit(function () {
          $("#aspnetForm").validate({
    
          
            
    
          });
    
          // if validate form then cancelPostBack
          if ($("#aspnetForm").valid()) { cancelPostback = false; }
          else { cancelPostback = true; }
    
          GrabPageRequestManager();
    
          
    
        });
      });
    }
    
    // Our own custom method to be attached to each new/future page request.. 
    function onEachRequest(sender, args) {
      //alert("About to cancel? " + cancelPostback);
      // Check to see if we need to Cancel this Postback based on Conditional Logic within this page.. 
      args.set_cancel(cancelPostback);
    }
    
    // Grab a reference to the Page Request Manager
    function GrabPageRequestManager() {
      var prm = Sys.WebForms.PageRequestManager.getInstance();
      prm.add_initializeRequest(onEachRequest);
    }
    
      
      </script>

    go live
    sábado, 3 de julho de 2010 13:29

Todas as Respostas

  •  

    Amigo já tive varios ambientes parecidos com o seu e funcionaram, o que você poderia fazer é "forçar" uma validação no click do botão, de uma olhada em http://docs.jquery.com/Plugins/Validation/valid

     

    No seu caso você faria assim;

     

    <asp:Button ID="btnSubmit" runat="server" CssClass="btnEnviar" Text="Submit" onclick="btnSubmit_Click" />

     

    no javascript 

     

     $(document).ready(function() {

    $(".btnEnviar").click(function() {

       $("#aspnetForm").valid();

    });

    });

     


    Se ajudou não esqueça de marcar como útil =) Alan Bruno Heil
    • Sugerido como Resposta Alan Heil sexta-feira, 28 de maio de 2010 11:47
    • Marcado como Resposta Douglas Rossetim sábado, 3 de julho de 2010 13:30
    sexta-feira, 28 de maio de 2010 11:46
  • Ao invés dessa coisa toda, não é mais simples usar o Validation nativo do ASP.NET que não vai dar problema algum com o postback? E é completamente personalizável pelo CSS? (caso queria validações cheia de firulas)

    Fkaeh - Gambi.NET® Framework Certificated 2010
    ----------------------------------------------
    Se tiver paciência para avaliar, agradeço: http://premio.clubedeautores.com.br/web/site_premio/votar.php?id=12633
    sexta-feira, 28 de maio de 2010 12:45
  • Fkaeh,
    Asp.Net Ajax funciona perfeitamente e é muito facil de usar, mas meu cenário de implementação exige um sistema performático.

    AspNet Ajax não é performático em relação ao Jquery, AspNet Ajax cria muito código desnecessariamente. Esta alternativa com Jquery objetiva a performance na aplicação.

    Meus formularios terão muitos campos e preciso me preocupar com performance. Realizei um teste comparando a quantidade de arquivos .js e o tamanho deles entre ASP.NET Ajax e Jquery.  Jquery ganhou em performance e tamanho.

    Obrigado pela Dica!

    go live
    sexta-feira, 28 de maio de 2010 20:00
  • Pessoal, consegui.
    Pra quem esta procurando algo parecido, deixo aqui o codigo criado.

    O código verifica se o formulário esta válido pelo Jquery. Caso negativo, é cancelado o postBack da pagina, evitando assim que a pagina seja enviada para o servidor.

    Voces vao notar tambem que existe uma DropDownList(ddlUF2), é um tratamento especifico para popular outra ddl (cidade).
    Qualquer duvida, ou ajuda, enviem um e-mail.
    Abraços!

    <script type="text/javascript">
    // By default, don't allow Postback until we've successfully validated our form on the client-side. 
    //var cancelPostback = true;
    
    // Every single time the page loads, including every single AJAX partial postback 
    function pageLoad() {
      // Reset the value to say that "We don't allow Postbacks at this stage".. 
      cancelPostback = true;
      // alert("pageLoad");   
    
      validateForm();
      // Attach client-side validation to the main form 
    }
    
    // Here custom method
    function validateForm(){
      // for simul event ScriptManager
      $(document).ready(function () {
    
        /*
        Here you can define own object dropDownList, for examples: 
        Object: $("#<%=ddlUF2.UniqueID %>").change(function () ...
        style: $(".cboPostBack").change(function () {
        */
        $(".cboPostBack").change(function () {
    
          //alert("change event for <your object>");
          cancelPostback = false;
    
          // Grab a reference to the Page Request Manager 
          //var prm = Sys.WebForms.PageRequestManager.getInstance();
          //prm.add_initializeRequest(onEachRequest);
          GrabPageRequestManager();
    
        });
    
        // Here Define your form for validate
        $("#aspnetForm").submit(function () {
          $("#aspnetForm").validate({
    
          
            
    
          });
    
          // if validate form then cancelPostBack
          if ($("#aspnetForm").valid()) { cancelPostback = false; }
          else { cancelPostback = true; }
    
          GrabPageRequestManager();
    
          
    
        });
      });
    }
    
    // Our own custom method to be attached to each new/future page request.. 
    function onEachRequest(sender, args) {
      //alert("About to cancel? " + cancelPostback);
      // Check to see if we need to Cancel this Postback based on Conditional Logic within this page.. 
      args.set_cancel(cancelPostback);
    }
    
    // Grab a reference to the Page Request Manager
    function GrabPageRequestManager() {
      var prm = Sys.WebForms.PageRequestManager.getInstance();
      prm.add_initializeRequest(onEachRequest);
    }
    
      
      </script>

    go live
    sábado, 3 de julho de 2010 13:29