2010-03-11 29 views
5

Estoy intentando detener la devolución de datos en el envío de formularios si mi validación de jQuery personalizada devuelve falso.Prevenir ASP.net __doPostback() de jQuery submit() dentro de UpdatePanel

¿Hay alguna manera de evitar que la función __doPostback() finalice dentro de la función submit()?

había asumido:

$('#aspnetForm').submit(function() { return false; }); 

que hacer el truco, pero al parecer eso no es el caso: ¿alguien tiene una sugerencia?

La función submit() bloquea la devolución de datos (no se devolverá si hace una pausa en un punto de interrupción en firebug), ¡pero parece que no puedo detener el evento una vez completada la función submit()!

Cheers, Ed

EDITAR

bien, tuve un lío rápida alrededor y descubrí que el hecho de que el botón que estoy usando para hacer la devolución de datos está ligada a un UpdatePanel como asyncpostbacktrigger parece ser el problema: si lo elimino como un desencadenante (es decir, hacer que produzca una devolución de datos completa), no hay problema para evitar que la devolución de datos devuelva falso;

¿Alguna idea de por qué la devolución de datos asincrónica no se puede detener usando return false?

Respuesta

5

Debe usar el lado del cliente PageRequestManager para manejar adecuadamente los eventos de envío de AJAX. (por ejemplo, evitar una devolución de datos asincrónica)

Si no tiene el control total de la página, puede haber JavaScript en la página que simplemente llama al __doPostBack() sin pasar por ninguna lógica de página. En este caso, además de lo anterior, debe almacenar el antiguo window.__doPostBack() y proporcionar el suyo propio, como se menciona en @tucaz en sus comentarios. (... y como ha mencionado, puede ser bastante desconcertante con el encadenamiento.) Para envíos regulares (que no sean AJAX), puede proporcionar un controlador de eventos como han señalado otros.

This page puede ser de ayuda y tiene algunos ejemplos de código que usan PageRequestManager. En particular:

initialize : function() 
{ 
    ... 

    this._onSubmitHandler = Function.createDelegate(this, this._onSubmit); 
    this._onPartialUpdateEnd = Function.createDelegate(this, this._onUpdateEnd); 

    if (typeof(Sys.WebForms)!== "undefined" && typeof(Sys.WebForms.PageRequestManager)!== "undefined") 
    { 
     Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, this._onSubmitHandler); 
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._onPartialUpdateEnd); 
    } 
    else 
     $addHandler(document.forms[0], "submit", this._onSubmitHandler); 
}, 

Editar: consecuencia de lo expuesto, esto, por ejemplo, funciona bien para mí (.Net 3.5 SP1, es Button1 gatillo en el UpdatePanel, etc ...):

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 

    <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.4.2.js" charset="utf-8" 
     type="text/javascript"></script> 

</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <div> 
       <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /> 
      </div> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="Button1" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    </form> 
    <script type="text/javascript"> 
     (function($, undefined) { 

      var submitHandler = function(e) { 
       return false; 
      } 

      if (typeof (Sys.WebForms) !== "undefined" && typeof (Sys.WebForms.PageRequestManager) !== "undefined") { 
       Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, submitHandler); 
      } else { 
       $("form").submit(submitHandler); 
      } 
     })(jQuery); 
    </script> 
</body> 
</html> 
+0

Sí, he revisado los documentos de UpdatePanel y parece que puedes cancelar reembolsos asincrónicos con PageRequestManager.getInstance(). abortPostBack(). Sin embargo, parece que esto no funciona correctamente: mi controlador de submit() ya no bloquea la devolución de datos. –

+0

@Ed Woodcock: mirando la fuente y el artículo encontrado, p. en http://msdn.microsoft.com/en-us/magazine/cc163380.aspx, abortPostBack() es para cancelar una solicitud * que ya se inició *. –

3
$('#yourPostButton').click(function(){ 
    return false; 
}); 

Esto debería hacer!

+0

@tucaz, espero que no te importe editar tu respuesta. – rahul

+1

Sí, pero luego tendría que adjuntarlo a cada botón del formulario, lo cual no es muy sensato. Necesito poder hacerlo con submit() (o algún equivalente) para poder usar el control que utiliza el código sin tener que configurarlo por página. –

+0

Si no es un problema para usted, puede agregarlo a cada botón con $ ('input [type = button]') o algo así o pruebe el .preventDefault() como lo sugiere la documentación de jQuery aquí http: // api. jquery.com/submit/ – tucaz

Cuestiones relacionadas