2010-03-11 19 views
5

Próbuję zatrzymać postback na formularzu, jeśli moja niestandardowa walidacja jQuery zwróci false.Zapobieganie ASP.net __do_popback() z jQuery submit() w ramach UpdatePanel

Czy istnieje sposób, aby uniemożliwić zakończenie funkcji __doPostback() z funkcji submit()?

ja zakłada:

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

by rade, ale widocznie to nie przypadek: ma ktoś jakieś sugestie?

Funkcja submit() blokuje oddzwonienie (nie będzie ona odświeżana, jeśli zatrzymasz się w punkcie przerwania w firebug), ale nie mogę zatrzymać zdarzenia po zakończeniu funkcji submit()!

Zdrówko, Ed

EDIT

OK, miałem krótki bałagan temat i odkrył, że fakt, że przycisk Używam powoduje odświeżenie strony jest związana z updatepanel jako asyncpostbacktrigger wydaje być problem: jeśli usunę go jako wyzwalacza (tj. spowodować, że produkt będzie pełny odświeżenie), nie ma problemu, zapobieganie odświeżenie zwrotne z powrotem false;

Jakieś pomysły, dlaczego asynchroniczny oddzwonienie nie może być zatrzymany przy użyciu zwrotu false?

Odpowiedz

5

Musisz użyć strony klienta PageRequestManager, aby poprawnie obsługiwać zdarzenia przesyłania AJAX. (np. zapobiec asynchronicznemu ogłaszaniu zwrotnemu).

Jeśli nie masz całkowitej kontroli nad stroną, na stronie może być JavaScript, który po prostu wywołuje __doPostBack() bez przechodzenia przez żadną logikę strony. W tym przypadku - oprócz powyższego - musisz przechowywać starą wersję window.__doPostBack() i podać własną - jako @tucaz wspomnianą w jego komentarzach. (... i jak wspomniałeś, może to być dość kłopotliwe z użyciem łańcuchów.) W przypadku zwykłych zgłoszeń (nie AJAX) możesz zapewnić obsługę zdarzeń, jak wskazali inni.

This page może być pomocny i ma kilka próbek kodu, które używają PageRequestManager. W szczególności:

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); 
}, 

Edit: W związku z powyższym, w tym, na przykład działa dobrze dla mnie (.Net 3.5 SP1, Button1 jest spust w updatepanel, itp ...):

<%@ 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

Tak, przeszedłem przez dokumenty UpdatePanel i wydaje się, że możesz anulować asynchroniczne posty zwrotne z PageRequestManager.getInstance(). abortPostBack(). Wydaje się jednak, że to nie działa poprawnie: moja procedura obsługi submit() nie blokuje już odświeżania. –

+0

@D Woodcock: patrząc na źródło i artykuł znaleziony np. na http://msdn.microsoft.com/en-us/magazine/cc163380.aspx, abortPostBack() służy do anulowania żądania, które * już się rozpoczęło *. –

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

To powinno zrobić!

+0

@tucaz, mam nadzieję, że nie masz nic przeciwko edycji odpowiedzi. – rahul

+1

Tak, ale wtedy musiałbym dołączyć to do każdego przycisku w formularzu, co nie jest zbyt sensowne. Muszę być w stanie to zrobić za pomocą funkcji submit() (lub jej odpowiednika), dzięki czemu mogę korzystać z formantu, który wykorzystuje kod bez konieczności konfigurowania go na zasadzie "strona po stronie". –

+0

Jeśli to nie problem, możesz dodać go do każdego przycisku za pomocą $ ('input [typ = button]') lub czegoś podobnego lub wypróbować .preventDefault() zgodnie z sugestią zawartą w dokumentacji jQuery tutaj http: // api. jquery.com/submit/ – tucaz

Powiązane problemy