【问题标题】:Website doesn't see newest session values until I refresh page, but refreshing resets values of controls在我刷新页面之前,网站不会看到最新的会话值,但刷新会重置控件的值
【发布时间】:2014-10-09 04:43:19
【问题描述】:

我的 ASP.NET 网站没有看到最新的 Session 值。单击按钮后将我的表单发送到服务器时,发送回浏览器的结果取决于Session 值。我用Page_Load 方法处理它们。它没有看到最后一次更改 od Session 值,而是在最后一次更改。看起来按钮的事件处理程序是在页面的事件处理程序之前执行的,但我不确定是否是这样。 我尝试用 Page_PreInit 等其他方法编写我的代码,但它仍然是一样的。唯一对我有用的是刷新页面:Response.Redirect(Request.Url.AbsoluteUri); 在任何Session 值发生任何更改后,但它会重置所有控件的值,我希望与以前一样。有没有更好的解决方案?

示例:当它第一次运行时,标签的文本是“单击按钮”,但是当我单击任何按钮时,没有任何反应。当我第二次点击任何一个按钮时,标签的文本是第一次点击的值(即使我点击A然后点击B,点击B后值会变为A)。

表格:

<form id="form1" runat="server">
    <div>
        <p>
            <asp:Label ID="Label1" runat="server" />
        </p>
        <p>
            <asp:Button ID="Button1" runat="server" Text="A" onclick="Button1_Click" />&nbsp;
            <asp:Button ID="Button2" runat="server" Text="B" onclick="Button2_Click" />
        </p>
        <p>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        </p>
    </div>
</form>

事件处理程序:

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Session["Letter"].ToString();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Session["Letter"] = "A";
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        Session["Letter"] = "B";
    }

全局方法:

void Session_Start(object sender, EventArgs e) 
{
    Session["Letter"] = "Click the button";
}

【问题讨论】:

  • show your code!!!..还显示您在代码中初始化/声明会话变量的位置.. 使用 Session{"yourvariable"] 和 HttpContext.Current.Session["yourvariable "] 听起来你也有一些 IsPostBack 问题或 Page_Load 正在重置会话变量
  • 我的代码很长,但我会尝试写一些简短的例子,然后编辑我的问题。
  • 你在使用Global.asax这个方法特别初始化protected void Session_Start(object sender, EventArgs e)吗??

标签: c# asp.net .net session


【解决方案1】:

没有您的代码非常困难,但听起来您正在按钮的单击事件(或其他一些控件/事件)的代码中设置 Session 集合值,并期望它在 Page_Load 期间位于 SESSION 集合中事件。

不是这样工作的——当页面请求进来时,Page_Load 发生在控件的事件之前。

在准备将页面发送回客户端之前发生此事件,而不是 Page_Load 使用 Page_PreRender。

您添加的代码证实了上述内容。

通常我不会使用 Session_Start 来初始化这样的东西,使用 Page_Load 和 IsPostBack 属性

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack){
       Label1.Text = "Click the button";
    }
}

【讨论】:

  • 好的,谢谢。我以为我尝试了所有 Page 的事件处理程序,但我一定错过了这个......
  • 不,我没有错过。它适用于我的简单示例,但不适用于我的网站。不在浏览器中显示结果。在我接受你的回答之前让我考虑一下。
  • 为此,您需要在页面的 Init 事件中重新创建 Button...
  • 抱歉,我删除了我的评论,因为我不确定我是否正确。是的,这样的指令:Button1.Click += new EventHandler(Button1_Click);Page_PreRender 中不起作用。谢谢。
  • 您的回答是正确且有帮助的,现在我明白出了什么问题。但是,当您想将商品添加到网上商店的购物篮并且有要购买的商品和放入购物篮的商品在同一页面上时,它是如何工作的?添加商品时,您必须生成新页面,其中包含要购买的商品和放入购物篮的商品,并带有删除这些商品的按钮。所以你必须先调用按钮事件,然后用新按钮生成页面并添加按钮的事件处理程序,但你不能在调用事件后添加事件处理程序。这有点奇怪。你平时使用Request属性吗?
猜你喜欢
  • 2014-11-25
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 2012-07-31
  • 2011-06-27
相关资源
最近更新 更多