我正在尝试一些开始变得奇怪的东西,但原则上听起来很正常。基本上我在我的ASP.NET应用程序中有一个MasterPage,它负责在所有页面中显示通常的Login / Logout框。当用户登录时,通常的"欢迎{名称}"出现。
登录的用户详细信息来自会话。
现在我有一个个人资料页面,用户可以更改他/她的名字,这一切都很正常。作为编辑后的页面回发的一部分,我使用新的用户详细信息更新会话。
我希望看到的是"欢迎"如果用户更改了消息,则会显示新名称。
我在生命周期中挖掘了一点,确实在Page_Load中访问Session但在UpdateButton_Click中进行了更新,欢迎消息在Session更改之前已经更新。
有没有人知道如何强制刷新母版页?或者在设计方面我还需要考虑其他事项?
我也尝试将Login / Logout框放入UserControl,但事情没有改变。
以下是按要求提供的更多详细信息:
PageLoad上的MasterPage(accountMenuTitle只是一个标签):
var loggedInUser = (Customer) Session["LoggedInUser"];
accountMenuTitle.InnerHtml = loggedInUser.Name;
ProfilePage Button_Click:
var updatedCustomer = update_Customer_Profile(txtFirstName.Text,
txtLastName.Text, txtAlternateEmail.Text, ... etc. etc.);
Session["LoggedInUser"] = updatedCustomer;
因此,当我单击配置文件页面中的按钮,页面重新加载时,登录的用户将在会话中更新,但主页面加载已经发生,标签显示旧名称。
答案 0 :(得分:1)
不要在Page_load中设置Control,而是直接在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;
}
答案 1 :(得分:0)
我最终实现的解决方案依赖于主页公开一种更新自身的方法。
母版页:
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();
如果说这比马尔科姆的答案更清楚,我还是有点犹豫不决:/ /
答案 2 :(得分:0)
您选择的方式是正确的..
您已经定义了Master指令,因此您现在拥有所有属性和其他访问权限。
我想与您分享为什么不直接从内容页面设置母版页属性而不是调用UPDATEPANEL方法(无论如何选择是您的)
我可以看到你使用会话的其他东西...你可以使用VIEWSTATE。