2009-11-13 83 views
1

我正在製作一個web應用程序。我更新面板時出現了一個奇怪的錯誤。ASP.Net的自動回發。當它太慢時會發生什麼?

好的,所以說你有兩個更新面板,每個更新面板都有一個文本框。這兩個文本框都是自動回發的,更新面板有條件地進行更新。

那麼,從我觀察到的行爲來看,好像服務器在處理請求時速度不及用戶,那麼它在客戶端會被忽略。 就像說你在其中一個文本框中鍵入內容,然後快速選擇下一個文本框並鍵入內容並將其標記出來。這應該導致2回發佈。

那麼,如果1回發在服務器上處理,另一個發生?該帖子是否會被丟棄在服務器端或客戶端?

我在觀察這種情況時遇到的主要問題是,第一次發佈回發時,會出現更新面板的Update()。那麼,當第二封回發出現中斷第一封時,它還會在更新面板(另一個)上執行更新。用戶看到的是,如果他們非常快速地瀏覽它(或者服務器處於高負載或任何狀態),那麼第二個更新面板會被更新,但不是第一個。

TL;博士:當一個回中斷另一個回傳,這是假設在第一篇文章將被更新回任何更新面板不更新(雖然第二回傳的有)

如何我可以解決這個問題還是解決它?我無法更新屏幕上的所有更新面板,因爲那時用戶當前所在的控件失去了焦點以及大量其他問題。

回答

3

UpdatePanels攔截回發並使用XMLHTTPRequest對象(即他們使用AJAX)向服務器發回請求。

第二個XMLHTTPRequest將取消第一個XMLHTTPRequest,如果第二個XMLHTTPRequest在第二個XMLHTTPRequest正在製作時仍在進行中。就我所知,這是標準行爲。

您可能希望將UpdatePanels更新在按鈕單擊上,而不是將更新附加到每個文本框上的事件(它聽起來像您將它們附加到blur事件)。通過這種方式,您可以確保沒有進行大量請求,並且可能在請求正在進行時禁用該按鈕,以防止新請求取消正在進行的請求。

編輯:

您可以防止其他請求而作出的形式在客戶端,而一個請求已在進行通過檢查PageRequestManagerisInAsyncPostBack財產。類似以下內容

function pageLoad(sender, args) { 

var pageManager = Sys.WebForms.PageRequestManager.getInstance(); 

// add a function to execute when an asynchronous postback is initialized 
pageManager.add_initializeRequest(checkAsyncPostback); 

} 

function checkAsyncPostback(sender, arg) 
{ 
    var pageManager = Sys.WebForms.PageRequestManager.getInstance(); 
    // check if an async postback is already in progress 
    if (pageManager.get_isInAsyncPostBack()) { 
     // cancel this async postback if one is currently in progress 
     arg.set_cancel(true); 
    } 
} 

從服務器端知道回發是否中斷並不是一個簡單的方法。

+0

以及我真的希望避免這樣做。有沒有辦法檢測到回發從服務器端中斷? – Earlz 2009-11-13 21:55:04

0

我無法專門回答您的問題,因爲我不知道頁面如何管理UpdatePanel及其請求/響應。但是,如果您使用Fiddler跟蹤呼叫,您可能很容易知道發生了什麼。當請求被解僱你可以看到,你可以看到響應,以及如果一個HTTP錯誤代碼被髮送回或拋出一個異常,等:

Fiddler2

0

看看使用UpdateProgress控件: http://www.asp.net/ajax/documentation/live/overview/UpdateProgressOverview.aspx

此外,UpdatePanels是這種事情矯枉過正。看看使用頁面方法(谷歌ASP.NET頁面方法)

編輯:爲了進一步澄清這將如何對你有用,修改UpdateProgress控件中的ProgressTemplate的內容以模態方式顯示,以便用戶直到請求完成才能執行任何操作。

+0

@it過度殺傷:是的,我知道這是一個簡單的例子,但這是一個巨大的應用程序。相信我,這不是過度的 – Earlz 2009-11-13 21:35:43

+0

這是可以理解的。 =)那麼在這種情況下,考慮使用UpdateProgress控件和一個ProgressTemplate風格,以模式出現 – zincorp 2009-11-13 21:44:48

相關問題