在Page_Load之前调用函数

我有一个调用函数A()的按钮

当我点击它时,我希望按顺序进行调用:

A() Page_Load() 

现在它正在做:

 Page_Load() A() 

有没有办法解决这个问题,还是仅仅是设计问题而我无能为力?

最简单的方法是使用HTML提交按钮并检查它是否在Page_Init中的每个回发的表单中

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

在您的ASP.NET代码中:

  

我认为这会奏效。

在page_load之后调用控件事件(例如按钮的单击事件)。 在page_load之前,不保证控件完全初始化。 如果你真的需要在调用page_load之前根据按钮是否被按下来调用函数你必须检查请求以检查按钮是否被按下(基本上是旧学校ASP)

您需要在Page_Init中调用您的函数。 Page_Init将在Page_Load之前发生。

这是ASP.NET页面生命周期概述 。

不完全是:在处理像Button_Click这样的回发事件之前,ASP.NET总是会调用Page_Load

但是,在处理回发事件后,您可以通过重定向到页面来完成所需的操作。 (使用Post-Redirect-Get模式 。)

在你的Page_Load方法中,你可以通过检查它是否是一个回发来避免运行任何相关代码两次:

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

正如Jeff Sternal回答的那样,Post-Redirect-Get模式是解决这类问题的好方法。

在我的情况下,我有一个日历,如果你点击一个日期,它会将其添加到调度程序。 调度程序在每个新日期都有按钮,需要将onclick函数绑定到它们。

因为新行添加了一个linkbutton(在日历上),所以在代码中新的调度程序日期是在Postback事件处理中添加的,这意味着新的按钮组没有与它们绑定的命令。

页面生命周期

发布获取重定向

至少,我不认为这可能不是你问题描述的方式。 当您单击一个按钮时,它将向服务器发送请求,然后服务器将开始处理它,并遵循Joseph发布的ASP.NET页面生命周期。

或者,您可以尝试对页面进行AJAX调用,而无需重新加载当前的页面,并执行您需要的任何处理。

这是您要在页面加载之前调用Page Init的操作。
看一下ASP.net页面生命周期

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

如果您的实际目标是在事件处理程序运行后发生“页面加载代码” – 例如,如果单击按钮会更改数据库中的某些内容,并且您希望更新的数据在加载时反映在页面上- 然后你可以从ASP.NET页面生命周期中 稍后调用的方法调用你的“页面加载代码”,而不是从事件处理程序调用,例如Page_PreRender ,而不是从Page_Load调用它。

例如,这里是.aspx.cs页面类的简化摘录,该页面类具有在页面填充逻辑之前运行的按钮事件处理程序,以及仅在单击按钮后在页面上可见的确认消息:

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