2009-03-25 5 views
47

Ich verstehe nicht, was die Seiteneigenschaft AutoEventWireUp verantwortlich ist.Was bedeutet AutoEventWireUp Seiteneigenschaft?

Während ich im Internet surfe, habe ich eine Menge Foren mit Diskussionen darüber gefunden und sie scheinen alle auffällig zu sein.

Kann ich bitte eine klare Erklärung dafür bekommen, was diese Eigenschaft genau bedeutet?

Ich habe this article gelesen, aber auch das verstehe ich nicht.

+0

Könnten Sie genauer angeben, was genau Sie nicht verstehen (zum Beispiel im Artikel)? – Cerebrus

+0

Wenn ich es richtig verstehe, heißt es dort, dass der Standardwert für diese Eigenschaft wahr sein kann und falsch sein kann - was ist das? – chester89

+0

Hat meinen Beitrag bearbeitet, um diesen zu beantworten! ;-) – Cerebrus

Antwort

51

Wenn eine Seite angefordert wird, löst sie verschiedene Ereignisse aus, die als Teil ihrer lifecycle angesehen werden. Ich behalte die von Peter Bromberg erstellte visual representation bei mir.

Die Eigenschaft AutoEventWireUp bei True verbindet einige dieser integrierten Ereignisse im Seitenlebenszyklus automatisch mit ihren Handlern. Dies bedeutet, dass Sie diese Ereignisse nicht explizit anhängen müssen (z. B. mit dem Handles-Schlüsselwort in VB).

Beispiele für diese integrierten Ereignisse wären Page_Init und Page_Load.

Wenn Sie AutoEventWireUp auf True setzen und bieten explizite Verkabelung der EventHandlers, finden Sie sie zweimal ausgeführt werden! Dies ist einer der Gründe, warum Visual Studio dieses Attribut standardmäßig auf false festgelegt hat.

Edit: (nach Chester89 Kommentar)


Es ist sinnvoll, dass der Standardwert des AutoEventWireUp Attributs der Seite zu beachten true ist, während der Standardwert der AutoEventWireUp Eigenschaft der Seite Klasse ist false

+0

Also, wenn für die Seitenklasse ist es standardmäßig falsch, ich expire es falsch von defalut auch für die Instanz dieser Klasse. Ist das korrekt? – chester89

+0

Ganz richtig! ;-) – Cerebrus

+0

aber Page ist eine Instanz der von System.Web.UI.Page abgeleiteten Klasse, also ist dieses Attribut nicht vererbbar? – chester89

9

Wie im Artikel erwähnt, wenn Sie AutoEventWireup eingeschaltet haben, asp.net werden Sie es automatisch erkennt eine Methode mit dem page_load Syntax und ruft automatisch:

private void Page_Load(object sender, System.EventArgs e) 
{ 
} 

Dies gibt Ihnen einen saubereren hinter Code auf Kosten von (sehr) kleinem Overhead. Beachten Sie, dass, wenn Sie es nicht geben Sie explizit asp.net sagen müssen Sie die Seite zu laden Ereignis behandeln wollen:

this.Load += new System.EventHandler(this.Page_Load); 

Beachten Sie, dass dies in der Seite zu anderen Veranstaltungen gilt, da es eine Namenskonvention verwendet als Page_Event.

+0

Dies gilt nicht nur für die Page_Load-Methode. Andere Event-Handler-Methoden (z. B. Page_Init, Page_PreRender usw.) werden ebenfalls automatisch verkabelt, wenn AutoEventWireUp aktiviert ist. – LukeH

+0

Nur fmoi: Sie müssen den Delegaten zu Ihrer Liste der Load-Event-Handler in einem Override-Eventhandler vor dem Load-Ereignis hinzufügen, z. OnInit oder OnPreInit. Vielleicht noch besser, Sie können diese Zeile zu einem leeren Konstruktor hinzufügen, der den Page-Konstruktor überschreibt. – user420667

26

Zu früheren Antworten hinzufügen; die automatischen Haken werden von TemplateControl.HookUpAutomaticHandlers angewendet. Diese Methode ruft TemplateControl.GetDelegateInformationWithNoAssert auf, die enthält, welche Methoden als Ereignishandler betrachtet werden.

Diese sind in System.Web, Version 2.0:

  • Auf allen Klassen von Seite ableiten: Page_PreInit, Page_PreLoad, Page_LoadComplete, Page_PreRenderComplete, Page_InitComplete, Page_SaveStateComplete.

  • Auf allen Klassen von Template ableiten: Page_Init, Page_Load, Page_DataBind, Page_PreRender, Page_UnLoad, Page_Error .`

  • Transaktionsunterstützung für alle Klassen von Template ableiten:

    • Page_AbortTransaction, oder wenn es existiert nicht, OnTransactionAbort
    • Page_CommitTransaction, oder wenn es nicht existiert, OnTransactionCommit

System.Web, Version 4.0 eingeführt, um eine Page_PreRenderCompleteAsync für alle Klassen von Seite abgeleitet. Diese Methode wird, wenn sie vorhanden ist, unter Verwendung von Page.RegisterAsyncTask registriert und automatisch "kurz vor dem PreRenderComplete-Ereignis" ausgeführt (Quelle: Page.ExecuteRegisteredAsyncTasks). Diese Methode scheint sehr undokumentiert zu sein, was darauf hindeutet, dass es bevorzugt wäre, stattdessen Page.RegisterAsyncTask mit Ihrer eigenen Methode aufzurufen.

+0

Interessante Antwort, Simon. Ich mag die dargestellten Details und es kann manchmal schwierig sein, diese Informationen zu finden. +1 – Cerebrus