【问题标题】:Button_click before Page_loadButton_click 在 Page_load 之前
【发布时间】:2012-07-04 14:51:40
【问题描述】:

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

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

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

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

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

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

感谢您的帮助,

昆汀

【问题讨论】:

    标签: c# asp.net session postback


    【解决方案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。

    【讨论】:

    • 您好,您的解决方案似乎不错。但是,它会引发其他问题。确实,用户以主页形式输入的所有其他变量都会随着 Response.Redirect 被遗忘。
    【解决方案2】:

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

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

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

    感谢您的帮助。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 如果创建了 LinkBut​​tons 等控件,则不会。
        猜你喜欢
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多