簡體   English   中英

ASP.net 無法從事件處理程序更新頁面

[英]ASP.net can't update page from event handler

我在頁面上有一個鏈接按鈕,該按鈕的單擊事件的事件處理程序調用 object 上的一個方法,該方法反過來調用一個 Web 服務,當 Web 服務返回 object 時會在頁面上觸發一個事件和一個事件處理程序代碼隱藏更新頁面上的 label。 由於某種原因,label 不顯示該消息。

這一直讓我發瘋,我在谷歌上找不到任何關於它的信息。 任何幫助都會得到幫助。

正在異步調用 Web 服務,但線程被阻塞,直到它返回。 並且標簽預渲染事件在其文本由代理對象事件處理程序設置后被調用。

所有調用都發生在同一個線程上,我設置的任何值,而不僅僅是 label 文本,在預渲染事件觸發時,事件處理程序中的值都將恢復為之前的值。

這是正在發生的事情:

  • 用戶點擊您的鏈接按鈕
  • 瀏覽器向 web 服務器發送回發請求
  • web 服務器創建一個全新的頁面實例 class 並開始新的頁面生命周期
  • 頁面生命周期完成所有正常的加載工作。
  • 頁面生命周期到達事件處理階段並運行你的點擊事件
  • 點擊事件通過您描述的“代理”object 調用 web 服務
  • 代理object異步調用web服務並返回
  • click 事件返回,因為它無事可做,從而釋放 ASP.Net 以繼續在頁面生命周期中移動。
  • 頁面生命周期結束,所以頁面被渲染到瀏覽器
  • 用戶看到新頁面,但label 是一樣的,因為 web 服務調用尚未完成
  • Web 服務調用返回到您的代理 object,這會引發其完成的事件
  • 您的事件處理程序更新已呈現的頁面 class 中標簽的文本屬性
  • 此請求中的頁面實例已被釋放。

更新:
OP 在我發布此問題后更新了他的問題,以表明生命周期時間保持同步。 因此,相反,我將指出 ASP.Net 中的控件不是線程安全的,而是從后台使用的線程調用 webservice 完成事件以發出異步請求,而不是從源線程調用。 您應該在設置屬性時Invoke控件。

你在你的 Page_Load 事件中有這個嗎?

if (Page.IsPostBack)
{
   return;
}

如果沒有,label 可以在回發后重新初始化。

網絡服務是否異步運行? 頁面渲染后可能會觸發 web 服務完成事件? 您是否已調試以確保正在設置 label 值?

暫無
暫無

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

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