回发发生后创建的会话和页面加载事件在ASP.NET中未正确使用会话

时间:2016-05-20 05:18:41

标签: asp.net session postback pageload

我已经为登录我的网站做了一个方便的“用户控制”,它被放置在网站主页中。

自然程序是用户登录网站,他应该发布一条包含其全名的欢迎信息。全名自然应该位于用户登录时创建的会话变量中。

毫无疑问,我们将所需的代码放在“page_load”事件中,并期望它将用户的全名传递给正确的情况(这里是一个名为lblFullName的标签),以便在打印/显示欢迎消息时单击登录按钮,但在用户再次登录网站(第2次)之前,全名不会通过。

为什么会出现这个问题?

我的代码的一部分:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["FullName"]==null)
        {
           //nothing 2 do.
        }
        else
        {
            lblFullName.Text = Session["FullName"].ToString();
        }
    }

1 个答案:

答案 0 :(得分:1)

您可能在处理Page_Load事件后在用户控件中设置了Session变量,以便在下一次回发之前不会看到用户名。

为了在验证登录后立即更新Label文本,您可以:

  1. 在用户控件中定义事件
  2. 在主页面中注册事件处理程序
  3. 用户登录后立即调用事件处理程序
  4. 在事件处理程序中,更新标签文本
  5. 您还可以通过在Session派生类中传递用户全名来消除EventArgs变量。如果您在用户控件和主窗体中可以访问以下类:

    public class StringEventArgs : EventArgs
    {
        public string Value { get; set; }
    
        public StringEventArgs(string value)
        {
           Value = value;
        }
    }
    

    然后您可以在用户控件中定义此事件:

    public event EventHandler<StringEventArgs> UserLoggedIn;
    

    在确认登录的功能中,您可以调用事件处理程序:

    private void UserLoginValidation()
    {
        // Login validation is done here
        bool loginSuccessful = ...
    
        if (loginSuccessful && UserLoggedIn != null)
        {
            UserLoggedIn(this, new StringEventArgs(fullName));
        }
    }
    

    在主页面中,注册事件处理程序,更新Label:

    protected void Page_Load(object sender, EventArgs e)
    {
        loginUserControl1.UserLoggedIn += loginUserControl1_UserLoggedIn;
        ...
    }
    
    private void loginUserControl1_UserLoggedIn(object sender, StringEventArgs e)
    {
        lblFullName.Text = e.Value;
    }