2009-06-09 3 views
3

Dies dient nur zum besseren Verständnis des ASP.NET-Framework. Wenn Sie ein Steuerelement in einer deklarativen Weise zu verwenden (das wäre Webformular Markup sein), können Sie Ereignishandler durch ihre Methodennamen mit einem Attribut, das mit On beginnt zuweisen:Wie haben die Attribute für Ereignishandlereigenschaften in ASP.NET-Steuerelementen ein Präfix (OnLoad für den Load-Ereignishandler)

<asp:Button runat="server" OnClick="..."/> 

Aber wenn man den Blick auf System.Web .UI.WebControls.Button Klasse hat eine Eventhandler Eigenschaft namens Click, dass die Delegierten zugeordnet:

button.Click += new EventHandler(...); 

wie wird diese umgesetzt? Ist das nur eine Konvention gefolgt vom Parser?

Ich weiß, es ist eine seltsame Frage, die Antwort wird nur meine Neugier befriedigen.

Antwort

5

Dies ist eine Benennungskonvention, die von ASP.NET verwendet wird und die, was nicht hilfreich ist, mit einer anderen allgemeinen Namenskonvention identisch ist, die in .NET weit verbreitet ist. Trotz der offensichtlichen Ähnlichkeit sind diese beiden Konventionen nicht miteinander verwandt.

Die .NET-Wide-Konvention, die hier irrelevant ist, ist, dass Ereignisse normalerweise entsprechende Methoden haben, die das Ereignis auslösen, und dass die Namen dieser Methoden durch Hinzufügen eines On-Präfixes gebildet werden Veranstaltungsname. Zum Beispiel bezieht sich das Click Ereignis, das von Button angeboten wird, auf eine Methode, die dieses Ereignis auslöst (wie bereits in einer anderen Antwort hier angegeben).

Das verwirrende Teil ist, dass die OnClickMethodenichts mit dem OnClickAttribute zu tun, dass die Frage betrifft.

Es ist einfach zu zeigen, dass die OnSomeEvent Methoden hier irrelevant sind, indem Sie ein Steuerelement schreiben, das keine solche Methode hat. Hier ist der Code-Behind für eine einfache Benutzersteuerung:

public partial class EventWithoutMethod : System.Web.UI.UserControl 
{ 
    public event EventHandler Foobar; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (Foobar != null) 
     { 
      Foobar(this, EventArgs.Empty); 
     } 
    } 
} 

Dies erklärt ein Foobar Ereignis. (Es erhöht es nie wirklich, aber das ist für die Zwecke der Erforschung nicht wichtig.) Es nicht eine OnFoobar Methode definieren. Dennoch ist ASP.NET vollkommen glücklich für uns, die OnSomeEvent Konvention zu verwenden, wenn wir die Kontrolle verwenden:

<user:EventWithoutMethod runat="server" OnFoobar="FooHandler" /> 

In der Tat, es ist nicht nur glücklich für uns, das zu tun, ist es tatsächlich erfordert es. Auch wenn meine Kontrolle kein Mitglied definiert, heißt OnFoobar - das Ereignis heißt nur Foobar - Ich muss OnFoobar schreiben, wenn ich den Ereignishandler aus meiner .aspx Datei anhängen möchte. Wenn ich nur ein Foobar-Attribut darin einlege, das Ereignis anzuhängen, wird der Handler nie laufen. (Nicht hilfreich, ASP.NET generiert keinen Fehler, wenn Sie das tun, es führt nur nichts mit dem Attribut zu tun, und der Event-Handler wird nie ausgeführt.)