2012-02-29 50 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