在Page_load之前按下Button_click

时间:2012-07-04 14:51:41

标签: c# asp.net session postback

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

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

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

最后,我的通用List未更新,因为会话变量是在page_load之后设置的。

编辑:我的会话变量是在代理人按下我的用户控件按钮时处理的功能中设置的。

是否有解决方案可以防止这种情况发生?有没有一个解决方案,通过使用会话变量来保持这个列表的价值?

感谢您的帮助,

昆汀

4 个答案:

答案 0 :(得分:1)

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

  1. 将您的通用列表保存到会话。
  2. 保存一个cookie,如flag(可以是会话值),表示该列表已保存。
  3. Resonse.Redirect(Request.RawURL)重定向到同一页面。
  4. 在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。

答案 1 :(得分:1)

我找到了解决方案:我必须覆盖主页面的Pre_render功能。 实际上,生命周期是:Page_load-> Button_click-> Page_PreRender。

所以在我的Pre_render函数中,我可以设置我的Session变量并按我的意愿使用它。

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

感谢您的帮助。

答案 2 :(得分:0)

为什么不在以下内容中设置会话:

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

因此,它会保留回发中的值,而不会在每次回发时设置它。

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

答案 3 :(得分:0)

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