Usuário com melhor resposta
Jquery validator com UpdatePanel e master page

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-fMaravilha! 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
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
-
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- Marcado como Resposta Douglas Rossetim sábado, 3 de julho de 2010 13:30
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
-
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 -
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 -
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- Marcado como Resposta Douglas Rossetim sábado, 3 de julho de 2010 13:30