ASP.Net:多次调用Page_Load()

时间:2009-07-07 21:20:38

标签: c# asp.net

我不太了解ASP.Net,但我正在尝试为消息框创建一个新控件。您输入一些信息并按下按钮。

但是,出于某些奇怪的原因,按下按钮时,第二次调用Page_Load(),并将所有成员变量重置为null!我需要那些变量,并且Page_Load()没有理由第二次被调用!当然,callstack是没用的。

9 个答案:

答案 0 :(得分:18)

请记住,在ASP.Net中,每当您进行任何类型的回发(包括处理按钮点击等事件)时,您都在使用必须从头开始重建的页面类的全新实例。您之前为在服务器上构建页面而完成的任何工作已消失。这意味着运行整个页面生命周期,包括您的页面加载代码,而不仅仅是点击代码。

  

总是两个,不多也不少。请求和回复。

答案 1 :(得分:4)

当页面回发时,调用Page_Load方法。然后,一旦服务器实际处理页面并根据更改向您发送新页面,将再次调用Page_Load,实际上是第一次在新页面上发送给您。

因此,如果要在Page_Load事件中提取数据或设置某些值,请将其括在以下块中:

if(!Page.IsPostBack)
{

}

保留你的一些州。否则,每次都会执行您放入Page_Load事件的指令。

有助于查看ASP.Net页面生命周期:)

答案 2 :(得分:1)

正如Joel所说,一旦页面被发送回客户端,实例变量将会丢失。但是,有多种方法可以存储变量的值,以便以后检索它们。如果您想了解更多内容,State Management上的此页面是一个很好的起点。

答案 3 :(得分:1)

任何需要url引用的标记/元素(如img,anchor,object等)都必须检查空引用。

e.g。 href =“”,url =“”,src =“”是一些常见错误。

答案 4 :(得分:1)

此代码适用于我:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (Session["something"] == null)
        {
            Session["something"] = "1";
        }
        else
        {
            Session["something"] = null;

            //your page load code here 

        }               
    }
}

答案 5 :(得分:1)

对我来说,问题有点复杂,但我发现了

protected override void OnPreRender(EventArgs e)

处理程序只调用一次,因此如果在管道中为你做的不晚,那么将一些操作放在那里会更安全。

答案 6 :(得分:1)

@ user3207728响应的扩展,我发现这个链接解释得很好并且有一个简单的解决方案......

http://www.aspdotnet-suresh.com/2010/04/detect-browser-refresh-to-avoid-events.html

不幸只检查if (!Page.IsPostBack)是不够的,因为IsPostBack在刷新时始终为FALSE。

答案 7 :(得分:0)

只是在黑暗中拍摄但可能在你的page_load之后添加:

if (!IsPostBack)
{

答案 8 :(得分:-1)

您可以使用会话或视图状态来保留变量的值..

  1. 如果要重定向到其他页面,请使用session []
  2. 如果您想要停留在同一页面上,请使用viewstate []