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

Session created after the postback occured and page-load event doesnt use session correctly in ASP.NET

我做了一个方便的“用户控件”用于登录我的网站,它放在站点主控中。

自然的过程是用户登录该网站,并且应该用包含其全名的欢迎消息通知他。全名自然应该位于用户登录时创建的会话变量中。

毫无疑问,我们将所需的代码放在“page_load”事件中,并希望它将用户的全名传递给正确的环境(这里是一个名为 lblFullName 的标签),以便 print/show点击登录按钮时的欢迎信息,但是全名直到用户再次登录网站(第2次)才通过。

为什么会出现这个问题?

这是我代码的一部分:

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

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

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

  1. 在用户控件中定义一个事件
  2. 在主页中注册一个事件处理器
  3. 用户登录后立即调用事件处理程序
  4. 在事件处理程序中,更新标签文本

您还可以通过在 EventArgs 派生的 class 中传递用户全名来消除 Session 变量。如果您在用户控件和主窗体中使以下 class 可访问:

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));
    }
}

在主页面中,您注册了更新标签的事件处理程序:

protected void Page_Load(object sender, EventArgs e)
{
    loginUserControl1.UserLoggedIn += loginUserControl1_UserLoggedIn;
    ...
}

private void loginUserControl1_UserLoggedIn(object sender, StringEventArgs e)
{
    lblFullName.Text = e.Value;
}