wake-up-neo.com

Wie erfasst man ein Sendeereignis mit jQuery in einer ASP.NET-Anwendung?

Ich versuche, das Ereignis submit eines Elements form mit jQuery zu behandeln.

    $("form").bind("submit", function() {
        alert("You are submitting!");
    });

Dies wird nie ausgelöst, wenn das Formular gesendet wird (als Teil eines Postbacks, z. B. wenn ich auf eine Schaltfläche oder einen Link-Button klicke).

Gibt es eine Möglichkeit, diese Arbeit zu machen? Ich könnte Ereignisse der einzelnen Elemente anhängen, die die Übermittlung auslösen, aber das ist nicht ideal - es gibt einfach zu viele Möglichkeiten (z. B. Dropdown-Listen mit Autopostback = true, Tastaturkürzel usw.)


Update: Hier ist ein minimaler Testfall - das ist der gesamte Inhalt meiner aspx-Seite:

<%@ page language="vb" autoeventwireup="false" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:scriptmanager id="ScriptManager" runat="server" enablepartialrendering="true">
                <scripts>
                    <asp:scriptreference path="/Standard/Core/Javascript/Jquery.min.js" />
                </scripts>
            </asp:scriptmanager>
            <p>
                <asp:linkbutton id="TestButton" text="Click me!" runat="server" /></p>
        </div>
    </form>

    <script type="text/javascript">
        $(document).ready(function() {
            alert("Document ready.");
            $("form").submit(function() {
                alert("Submit detected.");
            });
        });
    </script>

</body>
</html>

Ich erhalte die Warnung "Dokument bereit", aber nicht "Senden erkannt", wenn ich auf den Link-Button klicke.

28
Herb Caudill

Danke, @Ken Browning und @russau, dass sie mich in die Richtung des Hijacking __doPostBack gerichtet haben. Ich habe dazu verschiedene Ansätze gesehen:

  1. Hardcodieren Sie meine eigene Version von __doPostBack und fügen Sie sie später auf der Seite ein, damit sie die Standardversion überschreibt.
  2. Überladen Rendern Sie auf der Seite und fügen Sie meinen eigenen benutzerdefinierten Code in das vorhandene __doPostBack ein.
  3. Nutzen Sie die Funktionalität von Javascript und erstellen Sie einen Haken zum Hinzufügen von Funktionen zu __doPostBack. 

Die ersten beiden scheinen aus mehreren Gründen unerwünscht zu sein (zum Beispiel, in der Zukunft muss ein anderer Benutzer __doPostBack seine eigene Funktionalität hinzufügen), also habe ich mit # 3 angefangen. 

Diese addToPostBack-Funktion ist eine Variation einer üblichen Pre-jQuery-Technik, mit der ich window.onload, Funktionen hinzufügte, und sie funktioniert gut:

addToPostBack = function(func) {
    var old__doPostBack = __doPostBack;
    if (typeof __doPostBack != 'function') {
        __doPostBack = func;
    } else {
        __doPostBack = function(t, a) {
            if (func(t, a)) old__doPostBack(t, a);
        }
    }
};

$(document).ready(function() {
    alert("Document ready.");
    addToPostBack(function(t,a) {
        return confirm("Really?")
    });
});

Edit: addToPostBack geändert

  1. es kann die gleichen Argumente wie __doPostBack annehmen
  2. die hinzuzufügende Funktion findet vor __doPostBack statt
  3. die hinzugefügte Funktion kann zum Abbruch des Postbacks false zurückgeben
34
Herb Caudill

Ich hatte Erfolg mit einer Lösung mit Überschreiben von __doPostBack() , um eine Überschreibung von form.submit() (d. H. $('form:first').submit(myHandler)) aufzurufen, aber ich denke, es ist übertrieben. Ab ASP.NET 2.0 besteht die einfachste Problemumgehung darin,

  1. Definieren Sie eine Javascript-Funktion, die beim Senden des Formulars ausgeführt werden soll, d. H.

    <script type="text/javascript">
    
    function myhandler()
    {
        alert('you submitted!');
    }
    
    </script>
    
  2. Registrieren Sie Ihre Handler-Funktion in Ihrem Codebehind, d. H.

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        ScriptManager.RegisterOnSubmitStatement(Page, Page.GetType(), 
                                                "myHandlerKey", "myhandler()");
    }
    

Das ist alles! myhandler() wird von einfachen Eingaben der Tastatureingaben und automatischen __doPostBack()-Aufrufen gleich aufgerufen.

12
James McCormack

Ja, das ist nervig. Ich ersetze __doPostBack durch meinen eigenen, damit ich Ereignisse einreichen kann, die ausgelöst werden sollen.

Iirc, dies ist ein Problem beim Senden eines Formulars über Javascript (das Aufruf an __doPostBack do) in IE (möglicherweise auch anderen Browsern).

Mein __doPostBack-Ersatz ruft $(theForm).submit() auf, nachdem das Standardverhalten repliziert wurde (Werte in ausgeblendete Eingaben füllen).

4
Ken Browning

Wenn Sie .NET Framework 3.5 oder höher verwenden, können Sie ScriptManager.RegisterOnSubmitStatement () in Ihrem serverseitigen Code verwenden. Das registrierte Skript wird sowohl beim normalen Senden als auch beim DoPostback aufgerufen.

ScriptManager.RegisterOnSubmitStatement(this, this.GetType(), "myKey", "SomeClientSideFunction();");
1
fripp13

Ich weiß nicht, wie es mit jQuery geht, aber Sie können dem ASP.NET-Steuerelement eine OnClientClick-Eigenschaft hinzufügen:

<asp:linkbutton id="TestButton" text="Click me!" runat="server" OnClientClick="alert('Submit detected.');" />
1
Powerlord

Dies funktioniert zum Erfassen des Einreichens:

$("form input[type=submit]").live("click", function(ev) {
    ev.preventDefault();
    console.log("Form submittion triggered");
  });
0
Freeman
 $(document).ready(function () {

          $(this).live("submit", function () {

                console.log("submitted");
             }
}
0
zamoldar