在页面 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。