在回发发生后创建的会话和页面加载事件在 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 变量,以便在下一次回发之前它不会看到用户名。
为了在登录验证后立即更新标签文本,您可以:
- 在用户控件中定义一个事件
- 在主页中注册一个事件处理器
- 用户登录后立即调用事件处理程序
- 在事件处理程序中,更新标签文本
您还可以通过在 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;
}
我做了一个方便的“用户控件”用于登录我的网站,它放在站点主控中。
自然的过程是用户登录该网站,并且应该用包含其全名的欢迎消息通知他。全名自然应该位于用户登录时创建的会话变量中。
毫无疑问,我们将所需的代码放在“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 变量,以便在下一次回发之前它不会看到用户名。
为了在登录验证后立即更新标签文本,您可以:
- 在用户控件中定义一个事件
- 在主页中注册一个事件处理器
- 用户登录后立即调用事件处理程序
- 在事件处理程序中,更新标签文本
您还可以通过在 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;
}