1

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

例子:

.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>
4

3 回答 3

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;
}

在此处输入图像描述

于 2013-09-30T14:57:33.350 回答
1

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

当您的页面呈现时, <%=Session["bar"]%> 将替换为当前值。由于您的页面尚未“卸载”,因此该值尚未更新。换句话说,这个值不会在 javascript 代码运行时读取,而是在页面呈现时读取。要完成您的尝试,您需要在 Pre_Render 中设置您的值,而不是在 Unload 事件中。

如果 Pre_Render 不适合您,我可以想象一个解决方案,您可以结合使用异步方法调用和 AJAX 来将值放入您的代码中。这是对其工作原理的参考:http: //msdn.microsoft.com/en-us/library/bb398998.aspx。具体看最后一节,它正在做您所描述的事情(即从客户端脚本获取会话值)。

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

页面发送到客户端浏览器后触发 Page_Unload 事件(请参考此链接)。因此,您不能将任何值存储到 Session。

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

于 2013-09-30T15:57:38.183 回答