2

我正在使用包含用户控件的简单页面中的通用列表。

我使用 Session 变量填充此列表。这个 Session 变量是在我的 Button_click 事件中设置的。

当用户单击按钮时,会话变量被设置并发生回发。问题是 Page_load 在 Button_clicked 事件之前被调用......我们知道这是标准页面的生命周期。

最后,我的通用列表没有更新,因为会话变量是在 page_load 之后设置的。

编辑:我的会话变量是在我的用户控件按钮单击时由委托处理的函数中设置的。

有没有办法防止这种情况发生?有没有一种解决方案可以使用会话变量在许多回发中保持此列表的值?

感谢您的帮助,

昆汀

4

4 回答 4

1

在 Click 事件中,您应该做三件事:

  1. 将您的通用列表保存到 Session。
  2. 保存类似 cookie 的标志(可以是会话值),表明列表已保存。
  3. Resonse.Redirect(Request.RawURL)重定向到同一页面。

在 Page_Load 事件中,您应该执行以下操作:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (Session["MyFlag"] != null)
        {
            //Perform whatever you need to do with your already saved generic list in Session
            Session["MyFlag"] = null;
        }
    }
}

如果您需要跨回发存储像通用列表这样的复杂对象,Session 是您的朋友。如果您只需要存储一个值,您可以使用 cookie 或 ASP.HiddenField,但为此您最好使用 Session。

于 2012-07-04T15:00:15.913 回答
1

我找到了解决方案:我必须重写主页的 Pre_render 函数。事实上,生命周期是:Page_load->Button_click->Page_PreRender。

所以在我的 Pre_render 函数中,我可以设置我的 Session 变量并根据需要使用它。

据我了解,Pre_Render 事件通常用于在控件显示在页面上之前初始化控件的值。

感谢您的帮助。

于 2012-07-05T08:45:12.863 回答
0

你为什么不把你的会话设置在:

if(!IsPostback)
{
    // your session setting here (or method)
}

因此,它将保留整个回发的值,而无需在每次回发时设置它。

您还可以声明一个可以从 !IsPostback 或您的 cick 事件轻松调用的方法。

于 2012-07-04T15:01:35.073 回答
0

您还可以尝试将您的代码从 Page_Load 移动到 Page_PreRender,这将在您的按钮单击事件后触发。这应该可以解决您遇到的问题。

于 2012-07-04T15:13:48.417 回答