2012-04-03 6 views
3

Während eines Postbacks enthält die Formularvariable __EVENTTARGET die name of the control, die das Postback ausgegeben hat. Woher weiß ASP.NET, welches Ereignis für dieses Steuerelement ausgelöst wird, wenn das Steuerelement mehrere serverseitige Ereignisse unterstützt?Woher weiß ASP.NET, welches Ereignis während eines Postbacks ausgelöst werden soll?

+0

Fragen Sie, warum es tut, was es tut, oder WIE können Sie dies zum Funktionieren bringen? – brizz

+0

Keine von diesen. Wenn ein Steuerelement mehrere Ereignisse unterstützt, wie weiß asp.net, was ausgelöst werden soll? Das Übergeben der Steuerelement-ID in __EVENTTARGET kann nicht ausreichen. –

Antwort

0

Ich denke, dass die bei Kontrollen einen einzigen Wert halten, übergebenen Daten in Form ist, gibt für jeden Zweifel keine Notwendigkeit Raum ist - TextBox geändert werden kann, DropDownList haben kann ihren Wert geändert usw.

In der Tat, in der Regel solche Kontrollen haben eine Veranstaltung nur von der Client-Seite ausgelöst wird, sind andere Veranstaltungen für die serverseitige Pipeline (DataBinding, DataBound, Init, Load etc.)

Jedes Composite-Steuerelement auf der anderen Seite kann __EVENTARGUMENTS verwenden, um dem Server zusätzliche Parameter zur Verfügung zu stellen, damit das tatsächliche Ereignis ermittelt und ausgelöst werden kann.

5

Wie Wiktor erwähnt, sind viele der Steuerelemente in ASP.Net bereits so aufgebaut, dass Sie sie auf bestimmte Arten verwenden können. der Knopf Klick, der Text ändert sich, der ausgewählte Index hat sich geändert - diese Steuerelemente wurden erstellt, um bestimmte Dinge zu tun, which is why they work the way they do.

Aus der Dokumentation:

Da die meisten ASP.NET-Serversteuerereignisse eine Rundfahrt mit dem Server für die Verarbeitung erfordern, können sie die Leistung einer Seite beeinflussen. Daher bieten Serversteuerelemente eine begrenzte Anzahl von Ereignissen, normalerweise nur Click-Type-Ereignisse. Einige Serversteuerelemente unterstützen Änderungsereignisse. Für löst das CheckBox-Webserversteuerelement das CheckedChanged-Ereignis im Servercode aus, wenn der Benutzer auf das Feld klickt. Einige Serversteuerelemente unterstützen mehr abstrakte Ereignisse. Beispielsweise löst das Steuerelement des Calendar-Webservers ein SelectionChanged-Ereignis aus, das eine abstraktere -Version eines Klickereignisses ist.

Sie können natürlich Ihre eigenen clientseitigen Steuerelemente schreiben, aber das erfordert viel mehr Arbeit. Der Artikel Server Event Handling in ASP.Net diskutiert dies. Zusammenfassend ist jedoch der wichtige Abschnitt Implementierung RaisePostBackEvent

Wenn Sie mehrere Ereignisse bereitstellen möchten, dann variieren Sie das Ereignis, das an diese Methode vom Client gesendet wird, und heben Sie das entsprechende serverseitige Ereignis auf. Dies kann so einfach wie eine if-Anweisung sein. Ein einfaches Beispiel wäre zwei Client-Seite JavaScript-Ereignisse werden mit, von denen jeder nennen könnte:

__doPostBack(controlId, 'superclick'); 

__doPostBack(pageId, 'superchange'); 

Und dann, in Ihrem Post zurück Event-Handler, rufen Sie das gewünschte Ereignis Server-Seite basierend auf dem übergebenen Argument. Eine einfache Raisepostbackevent Server-Seite-Handler würde dann in etwa so aussehen:

public void RaisePostBackEvent(string eventArgument){ 

    if(eventArgument == "superclick") 
    { 
     OnSuperClick(this, new EventArgs()); 
    } 

    if(eventArgument == "superchange") 
    { 
     OnSuperChange(this, new EventArgs()); 
    }   

    } 
+0

RaisePostBackEvent enthält zwei Argumente http://msdn.microsoft.com/en-us/library/system.web.ui.page.raisepostbackevent.aspx – Pankaj

+0

@PankajGarg Das ist Page.RaisePostBackEvent. Siehe http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx, wie in der Antwort angegeben. Alternativ können Sie faul sein und einfach in Page.Request.Params ["__ EVENTARGUMENT"] nachsehen, wenn Sie zurückschreiben. – dash

0

Wenn Sie möchten, dass ein Postback Ereignis in Ihrer Kontrolle zu handhaben, würden Sie IPostBackEventHandler Schnittstelle implementieren. Das Framework ruft die IPostBackEventHandler.RaisePostBackEvent-Methode auf, die eventArgument akzeptiert. Basierend auf dem Ereignisargument können Sie verschiedene andere benutzerdefinierte Ereignisse auslösen.

Andere Steuerungsereignisse wie Init, Load usw. werden vom Framework automatisch aufgerufen, unabhängig davon, ob das Steuerelement Postback-Ereignisse verarbeiten kann.

1

Um Postback ASP.NET-Serversteuerung zu behandeln, muss IPostBackEventHandler Schnittstelle implementiert werden. Diese Schnittstelle hat eine einzige Methode void RaisePostBackEvent(string eventArgument), die ein Ereignis verarbeitet, das ausgelöst wird, wenn ein Formular an den Server gesendet wird.

Diese Methode ist verantwortlich für die Erhöhung der serverseitigen Ereignisse des Steuerelements. Der einzige Parameter hier ist eventArgumentder verwendet wird, um die Art des Ereignisses bei Bedarf zu unterscheiden (wie ein GridView).

z. Button Steuerung löst sowohl Click als auch Command Ereignisse aus. GridView analysiert den Befehlsnamen anhand des Ereignisargumentparameters und löst ein erforderliches Ereignis für den Befehl aus.

Sie könnten .NET-Decompiler verwenden (ich verwendete ausgezeichnete JetBrains dotPeek für diese), um die Implementierung der RaisePostBackEvent-Methode für die Standard-ASP.NET-Steuerelemente durchzusehen.

2

Debugging mit Hilfe eines HTTP-Sniffers wie Fiddler kann hier helfen. Grob, die Ereignisdetails sind im __EVENTARGUMENT Formularfeld. Wie diese Daten entpackt werden, ist ein Implementierungsdetail des bestimmten Steuerelements.

Beispielsweise fallen ein TreeView auf eine Form, und seine Haken TreeNodeCollapsed, TreeNodeExpanded und SelectedNodeChanged Ereignisse. Sie werden sehen, dass expandiert oder kollabiert ein Knoten führt zu einem Postback mit etwas wie tnode_text in __EVENTARGUMENT; während Auswahl ein Knoten in einem Postback mit etwas wie snode_text in __EVENTARGUMENT führt. Meine Vermutung ist, dass t für "toggle" steht und s für "select", aber ich habe nicht in die Quelle gegraben, um zu überprüfen.

(Übrigens, nur sagen "Toggle" ist gut genug für beide erweitern und reduzieren, da die ..._ExpandState Form Variable Details des Expansionszustand aller Knoten hält, sieht es aus wie).