2010-06-29 2 views
5

Ich schreibe einen Code, der die Wirkung eines Postbacks auf eine Seite nachahmt, indem genau dieselbe Webanforderung ausgeführt wird, die beim Klicken auf eine Schaltfläche generiert wird, die das Seitenpostback auslöst.Wie weiß eine asp.net-Seite, welcher Button ein Postback ausgelöst hat?

Das Problem ist, dass die Antwort von der Web-Anfrage ist nicht das gleiche wie das, was ich bekomme, wenn Sie auf die Schaltfläche klicken.

Bei der Untersuchung, ich sehe, dass, obwohl das Page_Load -Ereignis ausgelöst und behandelt wird, wenn ich die Webanforderung ausführen, der Handler für den Button klicken nicht ausgeführt wird (was bedeutet, dass entweder das Ereignis nicht ausgelöst wird, oder es ausgelöst wird) aber nicht behandelt - ich vermute, es ist eher der erste Fall).

Also meine Frage ist - Woher weiß ASP.NET, welche Schaltfläche geklickt wurde, so dass es den entsprechenden Handler aufrufen kann?

Ich dachte, dass dies mit dem __EVENTTARGET-Parameter getan wurde - ich habe das korrekt im Post-Body der Web-Anfrage eingestellt, aber das machte keinen Unterschied.

Ich schaute auf das decodierte __VIEWSTATE Argument, aber ich konnte nichts Offensichtliches darin sehen.

Kann jemand weitere Hilfe zur Verfügung stellen?

EDIT: Nur klar zu sein, ich bin nicht zu fragen, wie ein Click-Handler auf eine Web-Anwendung hinzuzufügen.

Eher, ich bin auf eine Anwendung, die bereits hat eine Schaltfläche klicken Ereignishandler, und ich möchte wissen, wie asp.net aus einer eingehenden Webanforderung herauskommt, welche Schaltfläche klicken Ereignishandler-Code aufrufen.

+0

Können Sie nähere Angaben dazu machen, wie Sie die Webanfrage stellen? Verwenden von C# -Code oder Jquery oder Javascript? Übergeben Sie den _Viewstate zusammen mit der Webanfrage? Welchen Fehler siehst du? –

+0

Ich benutze C#. Was ich mache ist, dass ich eine erste Anfrage an eine Seite mache und ein __VIEWSTATE Element in der Antwort zurückbekomme. Dann übergebe ich in der Web-Anfrage, die ich generiere, um das Postback nachzuahmen, den Wert dieses __VIEWSTATE. Ich sehe keinen Fehler - alles, was ich sehe ist, wenn ich einen Breakpoint auf den Server-Code setzen, ist, dass der Code, um den Button auf den Server klicken nicht angerufen wird. –

Antwort

0

OK, so dass ich dachte dies am Ende heraus.

Die Anfrage sollte ein Name-Wert-Paar enthalten, wobei der Name die ID der angeklickten Schaltfläche ist und der Wert '1' sein kann.

Was mich verblüfft ist, dass in der Anfrage, die durch Klicken auf die Schaltfläche generiert wurde, ich ein solches Name-Wert-Paar nicht sah. Sehr merkwürdig.

Nichtsdestoweniger führte das Hinzufügen dieses Namenswertpaares zu meiner erstellten Webanforderung dazu, dass der Ereignishandlercode für den Klickereignis ausgelöst wurde.

0

In Ihrem Code hinter, haben Sie ein Ereignis zu verarbeiten, und das Ereignis hat Handles ButtonName.Click

IE haben:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click 
    ''# Process everything you want to process when Button2 gets clicked 
End Sub 

Alternativ in der Taste, die Sie OnClick Satz in der haben kann Markup.

<asp:button ID="Button2" runat="server" OnClick="Button2_Click" Text="Click Me" /> 

Da die Schaltfläche runat="server" gesetzt ist, wird .NET alle für Sie schweres Heben tun.

+0

Hallo Rockinthesixstring, wie ich oben zu Cylon Cat gesagt habe, ich möchte nicht mit dem Klickereignis umgehen - ich möchte nur herausfinden, warum das vorhandene Klickereignis nicht ausgelöst wird, wenn ich eine Webanforderung aufruft, die mit der Anfrage identisch ist wird bei einem Klick auf die Schaltfläche aufgerufen. Wenn ich wüsste, was genau asp.net in der Web-Anfrage gesucht hat, um den Click-Handler-Code aufzurufen, dann würde ich das zur Web-Anfrage hinzufügen - daher meine ursprüngliche Frage, wie das ASP.net die Web-Anfrage analysiert gesendet, um herauszufinden, welcher Handler aufgerufen werden soll. –

0

Es gibt eine Reihe einfacher Möglichkeiten zum Erstellen eines Ereignishandlers für eine Schaltfläche. Doppelklicken Sie im Layoutmodus auf die Schaltfläche. Oder wählen Sie im Layoutmodus die Schaltfläche, öffnen Sie das Fenster Eigenschaften, klicken Sie auf das Symbol "Blitz" und sehen Sie sich eine Liste der Ereignisse an, die das Steuerelement auslösen kann. Doppelklicken Sie auf das gewünschte Ereignis.

Wenn Sie eines dieser Dinge tun, Visual Studio, erstellen Sie den Ereignishandler in Ihrem Code-Behind, und verbinden Sie das Ereignis.

Der Button-Ereignishandler wird nach dem Laden der Seite und nach der Seitenvalidierung ausgeführt, wenn Sie ASP.NET-Validatoren verwenden.

+0

Hi Cylon Cat, ** ** ** möchte nicht einen Event-Handler für eine Schaltfläche erstellen. Vielmehr möchte ich den Server-Code in einer Webanwendung ausspielen, die einen Button-Klick verarbeiten soll. Ich möchte dies tun, indem ich eine Web-Anfrage aufruft, die mit der Web-Anfrage identisch ist, die erzeugt wird, wenn auf eine Schaltfläche geklickt wird. Ich glaube, dass dies dazu führen sollte, dass der Button-Click-Handler-Code aufgerufen wird, aber das passiert nicht. Also möchte ich wissen, was asp.net in einer Web-Anfrage sucht, um herauszufinden, welcher Event-Handler-Code aufgerufen werden sollte. –

+0

Web-Anfragen werden sehr unterschiedlich von Schaltflächen-Klicks gehandhabt. Wenn Sie dies also als Web-Anfrage behandeln möchten, können Sie auf zwei Arten vorgehen. Eine besteht darin, Seitenmethoden zu verwenden, und die andere besteht darin, einen Webdienst zu erstellen. Ich habe keine Seitenmethoden verwendet, aber sie sind AJAX-Methoden, die auf einer Seite aufgerufen werden können, und Sie benötigen ein asp: ScriptManager-Tag, das angibt, dass Sie Seitenmethoden verwenden möchten. Wenn Sie einen Webdienst erstellen, wird der Dienstcode in ASP.NET in der Sitzung ausgeführt und hat Zugriff auf Sitzungsvariablen. Sie können eine Service-Referenz im asp: ScriptManager; das macht den Service von JavaScript aufrufbar –

1

Ich kann Ihre Frage nicht beantworten, aber ich kann Ihnen sagen, wie Sie herausfinden.

Fügen Sie eine Zeile zu page_load hinzu: Request.SaveAs (@ "c: \ temp \ request.txt", true); (zum Beispiel).

Klicken Sie dann auf Ihre Schaltfläche, um das Postback zu bewirken.

Dann lesen Sie den Inhalt von request.txt. Gibt es etwas Nützliches oder Interessantes darin?

+0

Danke, Wozza. Ich werde es versuchen und Sie wissen lassen, was ich herausgefunden habe. –

0

Es scheint wirklich nur der __EVENTTARGET Wert muss mit der ID der Schaltfläche, die Sie klicken möchten, gebucht werden. Sie müssen festlegen EnableEventValidation = "false" oder ASP.NET wird einen Fehler auslösen. Schau dir dieses Beispiel an. Plain HTML-Seite, Beiträge auf asp.net-Seite, Simulation einer Schaltfläche klicken Sie auf diese Seite, die ähnlich sein sollte, was Sie versuchen zu tun.

HTML-Seite:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form action="Default.aspx" method="post"> 
    <input value="cmdSubmit" name="__EVENTTARGET" type="hidden" /> 
    <input type="submit" value="submit" /> 
    </form> 
</body> 
</html> 

ASP.NET Seite mit Knopf klicken (Default.aspx):

<%@ Page Language="C#" EnableEventValidation="false" %> 
<script runat="server"> 

    protected void cmdSubmit_Click(object sender, EventArgs e) 
    { 
     litResult.Text = "Submit button clicked"; 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form id="form1" runat="server"> 
    <asp:Literal ID="litResult" runat="server" EnableViewState="false"></asp:Literal> 
    <asp:Button UseSubmitBehavior="false" ID="cmdSubmit" EnableViewState="false" runat="server" 
     OnClick="cmdSubmit_Click" Text="Submit" /> 
    </form> 
</body> 
</html> 
+0

Chris, ich könnte das Javascript generieren - aber wie würde das meine Frage beantworten, wie asp.net weiß, wie man besonderen Event-Handling-Code auslöst? –

+1

Es scheint mir, dass das Javascript den Wert des versteckten Felds __EVENTTARGET mit der ID des Steuerelements, auf das geklickt wird, festlegt und dann das Formular abschickt. Aber es gibt wahrscheinlich mehr als das, wie vielleicht das Viewstate-Feld nicht leer sein kann, um anzuzeigen, dass es ein Postback ist. –

+0

Das ist ein guter Punkt, Chris, und das dachte ich mir auch. Ich habe das Feld __EVENTTARGET der Anfrage überprüft, das beim Klicken auf die Schaltfläche generiert wurde, und es hatte die ID der Schaltfläche, auf die geklickt wurde. Ich stellte dann sicher, dass meine Anfrage den gleichen __EVENTTARGET-Wert hatte, aber dies schien nicht den Button-Click-Event-Handler auszulösen. Vielleicht steckt mehr dahinter. Ich wünschte, jemand könnte mehr Licht hier werfen ... –

5

Erstens macht eine ASP.NET-Knopf <asp:button> als <input type="submit" runat="server"...> Element auf dem Formular. In Bezug auf Postbacks verhält sich diese Schaltfläche anders als andere Steuerelemente.

Wenn geklickt <input type="submit"...> wird automatisch ein Postback ohne die Hilfe von ASP.NET (versuchen Sie es in einem .htm). Sie können bestimmen, auf welche Schaltfläche geklickt wurde, indem Sie die Parameter des POST-Hauptteils anzeigen. Der Name der Schaltfläche und ihr Wert (Text prop.) Werden als Parameter gesendet. __EVENTTARGET ist nicht im Bild und sollte null sein. Außerdem gibt es NUR EINEN Knopf in der Liste der Parameter gemäß der Spezifikation (der angeklickte). Jetzt wissen Sie also, auf welche Schaltfläche geklickt wurde.

Was ist dann __EVENTTARGET?

Andere Steuerelemente, wie <asp:DropDownList>, die als SELECT gerendert werden, feuern kein Postback, wenn Sie darauf klicken, sondern einfach ein onChange Javascript-Ereignis auslösen. Wenn Sie das Ereignis auf der Serverseite über das Ereignis SelectedIndexChanged behandeln möchten, muss ASP.NET zusätzliche Arbeit für Sie übernehmen. Wenn Sie AutoPostBack = True für die DropDownList festlegen, ASP.NET erfasst das ursprüngliche onChange JS-Ereignis und stellt eine benutzerdefinierte __doPostBack-JS-Funktion bereit, die für das Ausfüllen des Formulars __EVENTTARGET und explizit verantwortlich ist. Sie können jetzt das Steuerelement bestimmen, das das Postback ausgelöst hat, indem Sie __EVENTTARGET untersuchen.

Hoffe das hilft ein bisschen!

Verwandte Themen