簡體   English   中英

ASP.Net:Page_Load() 被多次調用

[英]ASP.Net: Page_Load() being called multiple times

我不太了解 ASP.Net,但我正在嘗試為消息框制作一個新控件。 您輸入一些信息並按下按鈕。

但是,由於某些奇怪的原因,當按下按鈕時,Page_Load() 被第二次調用,並且所有成員變量都被重置為 null! 我需要這些變量,而 Page_Load() 沒有理由被第二次調用! 當然調用棧是沒用的。

請記住,在 ASP.Net 中,每次您引起任何類型的回發(包括處理按鈕單擊等事件)時,您都在使用必須從頭開始重建的頁面類的全新實例。 您之前為在服務器上構建頁面所做的任何工作都已不復存在 這意味着運行整個頁面生命周期,包括您的頁面加載代碼,而不僅僅是點擊代碼。

總是有兩個,不多也不少。 一個請求和一個響應。

當頁面回發時,調用 Page_Load 方法。 然后,一旦服務器實際處理該頁面並根據更改向您發送一個新頁面,Page_Load 就會再次調用,實際上是第一次在新頁面上發送給您。

因此,如果您在 Page_Load 事件中提取數據或設置一些值,請將其包含在以下塊中:

if(!Page.IsPostBack)
{

}

保存你的一些狀態。 否則,您放入 Page_Load 事件的指令每次都會執行。

它有助於查看 ASP.Net 頁面生命周期 :)

正如 Joel 所提到的,一旦將頁面發送回客戶端,實例變量就會丟失。 但是,有多種方法可以存儲變量的值,以便您以后可以檢索它們。 如果您想了解更多信息,這個狀態管理頁面是一個很好的起點。

這段代碼對我有用:

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 

        }               
    }
}

對我來說,這個問題有點復雜,但我發現

protected override void OnPreRender(EventArgs e)

handler 只調用一次,因此如果在管道中為時不晚,將一些操作放在那里會更安全。

@user3207728 響應的擴展,我發現這個鏈接很好地解釋了它並且有一個簡單的解決方案......

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

不幸的是,僅檢查if (!Page.IsPostBack)是不夠的,因為IsPostBack在刷新時將始終為 FALSE。

任何需要 url 引用的標簽/元素,如 img、anchor、object 等,都必須檢查空引用。

例如 href="", url="", src="" 是一些常見的錯誤。

只是在黑暗中拍攝,但可能會在您的 page_load 之后添加:

if (!IsPostBack)
{

您可以使用會話或視圖狀態來保留變量的值..

  1. 如果要重定向到不同的頁面,請使用 session[]
  2. 否則,如果您想留在同一頁面上,請使用 viewstate[]

就我而言,問題與 iframe 有關,有一次我刪除了 iframe 一切正常

<iframe id="pdf2" 
   src="#"
   width="100%"
   height="100%">
</iframe>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM