marcgg
marcgg

Reputation: 66436

Calling a function before Page_Load

I have a button that calls function A()

When I click on it I want the calls to be made in that order:

A()
Page_Load()

Right now it's doing:

Page_Load()
A()

Is there a way around that or is it just by design and there's nothing I can do about it?

Upvotes: 6

Views: 24590

Answers (8)

Jon Schneider
Jon Schneider

Reputation: 26973

If your actual goal here is to have your "page loading code" happen after your event handler runs -- for example, if clicking your button changes something in your database, and you want the updated data to be reflected on the page when it loads -- then you could have your "page loading code" get called from a method that gets called later in the ASP.NET page life cycle than your event handler, such as Page_PreRender, instead of calling it from Page_Load.

For example, here's a simplified excerpt from an .aspx.cs page class that has a button event handler that runs before the page population logic, and a confirmation message that is visible on the page only after the button was clicked:

// Runs *before* the button event handler
protected void Page_Load() {
    _myConfirmationMessage.Visible = false;
}

// Runs *after* the button event handler
protected void Page_PreRender() {
    // (...Code to populate page controls with database data goes here...)
}

// Event handler for an asp:Button on the page
protected void myButton_Click(object sender, EventArgs e) {
    // (...Code to update database data goes here...)
    _myConfirmationMessage.Visible = true;
}

Upvotes: 0

sunnysidedown916
sunnysidedown916

Reputation: 175

This is what you want to do for Page Init is called before Page Load.
Take a look at the ASP.net Page Life Cycle

public void Page_Init(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        //CALL YOU FUNCTION A()    
    }
}
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {

    }
}

Upvotes: 0

Stephen
Stephen

Reputation: 116

As Jeff Sternal answered, The Post-Redirect-Get pattern is a good way of solving a problem like this.

In my circumstances i had a calendar and if you clicked a date it would add that to a scheduler. The scheduler would have buttons on each new date that needed to have onclick functions tied to them.

Because the new row was being added with a linkbutton(on the calendar), in the code the new scheduler date was being added at the Postback event handling meaning that the new set of buttons wouldn't have a command tied to them.

The page life Cycle

Post Get Redirect

Upvotes: 3

Anderson Imes
Anderson Imes

Reputation: 25650

The easiest way to do this would be to use a HTML Submit button and check to see if it is in the Form on every postback in Page_Init

public void Page_Init(object o, EventArgs e)
{
     if(!string.IsNullOrEmpty(Request.Form["MyButtonName"]))
     {
          A();
     }
}

And in your ASP.NET code:

<Button Type="Submit" Name="MyButtonName" Value="Press Here To Do Stuff Early!" />

I think that will work.

Upvotes: 18

Rune FS
Rune FS

Reputation: 21742

Control events (such as the click events of buttons) are called after page_load. The controls are not guarenteed to be fully initialized prior to page_load. If you really need to call a function before page_load has been called based on whether a button has been pressed you'll have to examine the request to check if the button has been pressed (basically old school ASP)

Upvotes: 7

Mr. Smith
Mr. Smith

Reputation: 5558

I don't think it's possible, at least, not in the way described by your question. When you click a button it will send a request to the server which in turn will start processing it, and follow the ASP.NET Page Lifecycle as posted by Joseph.

Alternatively you could try making an AJAX call to a page without reloading the current one you're on and do whatever processing you require.

Upvotes: 1

Jeff Sternal
Jeff Sternal

Reputation: 48583

Not exactly: ASP.NET will always call Page_Load before handling postback events like Button_Click.

However, you can accomplish what you want by redirecting to your page after handling the postback event. (Using the Post-Redirect-Get pattern.)

Inside your Page_Load method, you can avoid running any relevant code twice by checking to see if it's a postback first:

if (!this.IsPostBack) {
    // Do something resource-intensive that you only want to do on GETs
}

Upvotes: 3

Joseph
Joseph

Reputation: 25513

You need to call your function in the Page_Init. Page_Init will happen before Page_Load.

Here's an Overview of the ASP.NET Page Lifecycle.

Upvotes: 5

Related Questions