在Page_Unload上更新会话值而不刷新?

时间:2013-09-30 14:45:49

标签: c# javascript asp.net session pageload

我正在尝试在Page_Unload事件上保存一个值,将其存储在Session(或ViewState)中,然后从javascript中使用它。但是,Session的值仅在回发/刷新页面后才会更新,但我需要避免页面刷新,我该如何实现?

示例:

.cs

public void Page_Unload(object sender, System.EventArgs e)
{
    string s="some text";
    if (s.Contains("foo")) Session["bar"] = 37; else Session["bar"] = 38;
}

.aspx

<script type="text/javascript">
   function tst() {
     alert('<%=Session["bar"]%>');
   }
</script>

3 个答案:

答案 0 :(得分:2)

Page_Unload事件太晚,无法为会话状态分配新值。

相反,您希望使用Page_PreRender事件。

protected void Page_PreRender(object sender, EventArgs e)
{
   string s="some text";
   if (s.Contains("foo")) Session["bar"] = 37; else Session["bar"] = 38;
}

enter image description here

答案 1 :(得分:1)

首先,这是一个了解事件生命周期的有用页面。 http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx#general_page_lifecycle_stages

当您的网页呈现时,&lt;%=会话[“栏”]%&gt;由当前值替换。由于您的页面尚未“卸载”,因此该值尚未更新。换句话说,当javascript代码运行时,不会读取此值,而是在呈现Page时。要完成您的尝试,您需要在Pre_Render中设置您的值,而不是卸载事件。

如果Pre_Render不适合您,我可以设想一个解决方案,您可以使用Asyncronous方法调用和AJAX的组合来获取代码中的值。以下是对其工作原理的引用:http://msdn.microsoft.com/en-us/library/bb398998.aspx。具体来看,最后一节正在完成您所描述的内容(即从客户端脚本中获取会话值)。

  1. 向页面添加脚本管理器。
  2. 将PageMethods属性设置为true
  3. 为会话添加一个标记,以便“仍在使用它”和“完成”
  4. 使用Pre_Render中的异步委托调用长时间运行的进程以获取值。
  5. 在Async回调中设置会话值并将新标志设置为“已完成”
  6. 在页面卸载中调用Async委托“EndXXX”方法。
  7. 创建一个检查标志值的公共静态方法,如果设置为“completed”,则返回所需的会话值。

答案 2 :(得分:1)

页面发送到客户端浏览器后会触发Page_Unload事件(请参阅此link)。因此,您无法将任何值存储到Session。

在您的情况下,您可能需要进行回调以避免整页刷新(请参阅此link)。然后在回调触发的事件中。完成所有需要完成的工作后,您可以进行检查,然后将必要的变量存储到Session中,以便在客户端javascript中使用。