Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How come the attributes for event handler properties on ASP.NET controls have a prefix (OnLoad for the Load event handler)

This is just for a better understanding of the ASP.NET framework. When you use a control in a declarative way (that would be web form markup), you assign event handlers by their method name using an attribute that starts with On:

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

But when you look at the System.Web.UI.WebControls.Button class it has an EventHandler property named Click that the delegate is assigned to:

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

So how is this implemented? Is that just a convention followed by the parser?

I know, it's a strange question, the answer will do nothing but satisfy my curiosity.

like image 906
Michiel van Oosterhout Avatar asked Jun 09 '09 09:06

Michiel van Oosterhout


People also ask

What are event handlers in asp net?

The server has a subroutine describing what to do when the event is raised; it is called the event-handler. Therefore, when the event message is transmitted to the server, it checks whether the Click event has an associated event handler.

Which of the following stages of the lifecycle of a page is used to closing the files and database connections?

UnLoad - The UnLoad phase is the last phase of the page life cycle. It raises the UnLoad event for all controls recursively and lastly for the page itself. Final cleanup is done and all resources and references, such as database connections, are freed.


1 Answers

This is a naming convention used by ASP.NET which, rather unhelpfully, looks identical to another common naming convention widely used throughout .NET. Despite the apparent similarity, these two conventions are unrelated.

The .NET-wide convention, which turns out to be irrelevant here, is that it's common for events to have corresponding methods that raise the event, and for those methods' names to be formed by adding an On prefix to the event name. For example, the Click event offered by Button is related to an OnClick method, which raises that event (as has already been stated in another answer here).

The confusing part is that the OnClick method has nothing to do with the OnClick attribute that the question concerns.

It's easy to demonstrate that the OnSomeEvent methods are irrelevant here by writing a control that doesn't have any such method. Here's the codebehind for a simple user control:

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);
        }
    }
}

This declares a Foobar event. (It never actually raises it, but that doesn't matter for the purposes of exploration.) It does not define an OnFoobar method. Nevertheless, ASP.NET is perfectly happy for us to use the OnSomeEvent convention when we use the control:

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

In fact, it's not only happy for us to do that, it actually requires it. Even though my control doesn't define any member called OnFoobar—the event is called just Foobar—I have to write OnFoobar if I want to attach the event handler from my .aspx file. If I just put a Foobar attribute in there in an attempt to attach the event, the handler will never run. (Unhelpfully, ASP.NET doesn't generate an error when you do that, it just silently fails to do anything with the attribute, and the event handler never runs.)

like image 153
Ian Griffiths Avatar answered Sep 28 '22 04:09

Ian Griffiths