在页面 postpack 中更改会话并在母版页中使用新值
Changing Session in page postpack and using new value in Master Page
我正在尝试一些开始变得奇怪但原则上听起来很正常的事情。基本上我的 ASP.NET 应用程序中有一个 MasterPage,负责在所有页面中显示通常的 Login/Logout 框。当用户登录时,通常会出现"Welcome {Name}"。
登录用户的详细信息来自会话。
现在我有一个个人资料页面,用户可以在其中更改 his/her 名称,这很正常。作为编辑后页面回发的一部分,我使用新的用户详细信息更新会话。
我希望看到的是,如果用户更改了 "Welcome" 消息,它会显示新名称。
我在生命周期中进行了一些挖掘,确实考虑到会话在 Page_Load 中访问但随后在 UpdateButton_Click 中更新,欢迎消息在会话更改之前已经更新.
有没有人知道如何强制刷新母版页,或者在设计方面我可能需要考虑其他事项?
我也试过将 Login/Logout 框放入 UserControl,但事情没有改变。
根据要求,这里有更多详细信息:
PageLoad 上的 MasterPage(accountMenuTitle 只是一个标签):
var loggedInUser = (Customer) Session["LoggedInUser"];
accountMenuTitle.InnerHtml = loggedInUser.Name;
个人资料页面Button_Click:
var updatedCustomer = update_Customer_Profile(txtFirstName.Text,
txtLastName.Text, txtAlternateEmail.Text, ... etc. etc.);
Session["LoggedInUser"] = updatedCustomer;
因此,当我单击个人资料页面中的按钮时,页面会重新加载,已登录的用户会在会话中更新,但母版页加载已经发生并且标签显示旧名称。
不要在 Page_load 中设置控件,而是直接在 MasterPage 中呈现值。
MasterPage
<div class="title">
<h1>
<% if (Session["UserName"] != null)
{ %>
<%= Session["UserName"] %>
<% } %>
</h1>
</div>
事件处理程序
protected void Button1_Click(object sender, EventArgs e)
{
Session["UserName"] = this.TextBox1.Text;
}
我最终实现的解决方案依赖于母版页公开更新自身的方法。
主页:
public void UpdateLoginPanel()
{
if (Session["LoggedInUser"] == null) // logged out
{
accountMenuTitle.InnerHtml = "Log in";
}
else // logged in
{
var loggedInUser = (Customer) Session["LoggedInUser"];
accountMenuTitle.InnerHtml = loggedInUser.Name;
}
}
在配置文件页面 aspx 文件中,您可以像这样显示您的母版页:
<%@ MasterType VirtualPath="~/CustomerPortal.Master" %>
然后在代码隐藏按钮中点击:
var updatedCustomer = update_Customer_Profile(txtFirstName.Text,
txtLastName.Text, txtAlternateEmail.Text, ... etc. etc.);
Session["LoggedInUser"] = updatedCustomer;
Master.UpdateLoginPanel();
老实说,这是否比 Malcolm 的回答更清晰,我仍然有点不确定:/
您好,您在这里选择的方式是正确的..
您已经定义了 Master 指令,所以您现在拥有的所有属性和其他访问权限..
我想和你分享一件事,为什么你不直接从内容页面设置主页 属性 而不是调用 UPDATEPANEL 方法(无论如何选择是你的)
其他我可以看到你使用了会话...你可以使用 VIEWSTATE。
我正在尝试一些开始变得奇怪但原则上听起来很正常的事情。基本上我的 ASP.NET 应用程序中有一个 MasterPage,负责在所有页面中显示通常的 Login/Logout 框。当用户登录时,通常会出现"Welcome {Name}"。
登录用户的详细信息来自会话。
现在我有一个个人资料页面,用户可以在其中更改 his/her 名称,这很正常。作为编辑后页面回发的一部分,我使用新的用户详细信息更新会话。
我希望看到的是,如果用户更改了 "Welcome" 消息,它会显示新名称。
我在生命周期中进行了一些挖掘,确实考虑到会话在 Page_Load 中访问但随后在 UpdateButton_Click 中更新,欢迎消息在会话更改之前已经更新.
有没有人知道如何强制刷新母版页,或者在设计方面我可能需要考虑其他事项?
我也试过将 Login/Logout 框放入 UserControl,但事情没有改变。
根据要求,这里有更多详细信息:
PageLoad 上的 MasterPage(accountMenuTitle 只是一个标签):
var loggedInUser = (Customer) Session["LoggedInUser"];
accountMenuTitle.InnerHtml = loggedInUser.Name;
个人资料页面Button_Click:
var updatedCustomer = update_Customer_Profile(txtFirstName.Text,
txtLastName.Text, txtAlternateEmail.Text, ... etc. etc.);
Session["LoggedInUser"] = updatedCustomer;
因此,当我单击个人资料页面中的按钮时,页面会重新加载,已登录的用户会在会话中更新,但母版页加载已经发生并且标签显示旧名称。
不要在 Page_load 中设置控件,而是直接在 MasterPage 中呈现值。
MasterPage
<div class="title">
<h1>
<% if (Session["UserName"] != null)
{ %>
<%= Session["UserName"] %>
<% } %>
</h1>
</div>
事件处理程序
protected void Button1_Click(object sender, EventArgs e)
{
Session["UserName"] = this.TextBox1.Text;
}
我最终实现的解决方案依赖于母版页公开更新自身的方法。
主页:
public void UpdateLoginPanel()
{
if (Session["LoggedInUser"] == null) // logged out
{
accountMenuTitle.InnerHtml = "Log in";
}
else // logged in
{
var loggedInUser = (Customer) Session["LoggedInUser"];
accountMenuTitle.InnerHtml = loggedInUser.Name;
}
}
在配置文件页面 aspx 文件中,您可以像这样显示您的母版页:
<%@ MasterType VirtualPath="~/CustomerPortal.Master" %>
然后在代码隐藏按钮中点击:
var updatedCustomer = update_Customer_Profile(txtFirstName.Text,
txtLastName.Text, txtAlternateEmail.Text, ... etc. etc.);
Session["LoggedInUser"] = updatedCustomer;
Master.UpdateLoginPanel();
老实说,这是否比 Malcolm 的回答更清晰,我仍然有点不确定:/
您好,您在这里选择的方式是正确的..
您已经定义了 Master 指令,所以您现在拥有的所有属性和其他访问权限..
我想和你分享一件事,为什么你不直接从内容页面设置主页 属性 而不是调用 UPDATEPANEL 方法(无论如何选择是你的)
其他我可以看到你使用了会话...你可以使用 VIEWSTATE。