2012-02-29 30 views
0

錯後我有一個asp.net網站來管理項目。我意識到,當我點擊下一個項目的速度非常快時,它通常會用第一個項目的數據覆蓋所有下一個項目。我之前調用了一種方法來保存下一個項目。我也使用會話變量作爲項目的ID。ASP.NET會話變量是多個點擊事件快速

編輯:

它看起來像服務器堆棧的保存方法和IDS,但保持在控制的第一個項目的值

我說得對不對?

這是調用服務器方法來獲取ID,並將其設置在隱藏字段阿賈克斯:

function NextClick() { 
      var tabvalue = $("#<%=TabsToFocus.ClientId%>").val(); 
      $.ajax(
       { 
        type: "POST", 
        url: "Projet.aspx/NextProj", 
        data: "{tab:'" + tabvalue + "'}", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function(d) { 
         if (d.d != "False") { 
          $("#<%=hid_selProjetID.ClientID%>").val(d.d); 
          var btn = $("#<%=btnClickLstProjet.ClientID%>"); 
          fillHidden(); 
          btn.click(); 
         } 
        } 
       }); 
      } 

而且btn.click()調用服務器端的這個方法保存

Private Sub Button1_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClickLstProjet.ServerClick 

    If HttpContext.Current.Session.Item("isUser") IsNot Nothing AndAlso HttpContext.Current.Session.Item("isUser") = True Then 
     If HttpContext.Current.Session.Item("curProjetID") IsNot Nothing Then 

      btnSaveIndicateurs_Click() 
      btnSaveEnTete_Click() 
      btnSaveGen_Click() 
      btnSavePlanif_Click() 
     End If 
    End If 

    HttpContext.Current.Session.Item("curProjetID") = hid_selProjetID.Value 
    Response.Redirect("Projet.aspx") 

End Sub 

謝謝

+2

顯示您的代碼處理單擊事件並設置會話變量的位置。 – 2012-02-29 19:36:17

+0

1秒鐘即將到來。我試圖讓它更易讀,更簡單。我的代碼是在法國 – Marc 2012-02-29 19:50:47

+0

@Tim Schmelter更新 – Marc 2012-02-29 20:01:59

回答

1

你應該使用會話停止做的第一件事。

嚴重的是,從回會話對象了。

正確使用會話的是長期的,相當不變的數據。數據必須在字面上每次回發等都屬於頁面本身。


這是發生了什麼事。

  1. 您點擊一個鏈接加載項目。 Session變量正在使用當前項目ID進行設置。

  2. 然後你點擊一個鏈接,以獲得下一個項目,

  3. 然後迅速點擊該鏈接後,得到了一個。

的服務器,與此同時,多線程的。 #3基本上中斷了#2的執行......並且在#2之前跑了。這意味着你的會話變量是頂起來的。

爲什麼會二號之前的第三個請求,運行?那麼,你正在執行一些查詢。請求2的查詢很可能比請求3的請求稍長。

解決方案:停止使用會話。

原因:您無法預測IIS將對請求做出響應的順序。 IIS是一個並行(而不是串行)引擎,請求可能發生在你認爲他們應該做的序列之外。

最後,那個說會話被第一個請求者鎖定的人並不完全準確。它是WRITE鎖定..但只有當頁面開始寫入會話時纔會發生。讀取未鎖定。

因此,當請求3執行時,它使用請求1或2的ID。取決於到達寫入代碼的時間哪個仍處於活動狀態。

+0

謝謝!現在我更瞭解它是如何工作的!我希望我可以停止使用會話,但我的老闆不想...所以我禁用控件來改變項目,當它加載... – Marc 2012-03-01 00:50:21