2013-09-30 67 views
1

我想在Page_Unload事件上保存一个值,将它存储在Session(或ViewState)中,然后从javascript中使用它。但是,只有在回发/刷新页面后,会话的值才会更新,但我需要避免页面刷新,我该如何实现?在没有刷新的情况下获取在Page_Unload上更新的会话值?

例子:

中的.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> 
+0

你说的是你想避免页面刷新,但是,你正在做一个页面卸载事件(这意味着你刷新页面)。它是否真的处于卸载事件中,您必须执行此代码,或者可以在控件的Click事件中完成吗? – CharlesAD

+0

我不能在控件的点击事件中做到这一点,因为我需要避免回传(因为网页形式的特定原因) – BornToCode

回答

1

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

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

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

+0

但是这会延迟客户端获取页面直到Page_PreRender完成 - 我想避免这种情况下,该方法中有一个耗时的操作 – BornToCode

+1

@BornToCode我不能推荐替代解决方案,因为我不知道你的代码的其余部分。我的猜测是使用Ajax和进度条(或加载图标),以便用户知道该页面正在工作。 – Win

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不适合您,我可以想象一个解决方案,您可以使用Asyncronous Method调用和AJAX的组合将值存入您的代码中。以下是关于如何工作的参考:http://msdn.microsoft.com/en-us/library/bb398998.aspx。特别看看你正在描述的最后一部分(即从客户端脚本获取会话值)。

  1. 添加脚本管理器到页面。
  2. 将PageMethods属性为true
  3. 添加一个标志,会话“仍然在它的工作”和“做”
  4. 打电话给你的长期运行过程中使用的Pre_Render的asyncronous委托获得的价值。
  5. 在异步回调中设置会话值并将新标志设置为“已完成”
  6. 在页面卸载中调用异步委托“EndXXX”方法。
  7. 创建一个检查标志值的公共静态方法,如果设置为'completed',则返回所需的Session值。
+0

Pre_Render对我不好,因为我正在运行耗时的操作,并且我不想延迟客户端获取页面直到完成 – BornToCode

+0

我修改了我的答案以添加第二个解决方案。 –

相关问题