[英]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)
{
您可以使用會話或視圖狀態來保留變量的值..
就我而言,問題與 iframe 有關,有一次我刪除了 iframe 一切正常
<iframe id="pdf2"
src="#"
width="100%"
height="100%">
</iframe>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.