在页面包中更改会话并在主页面中使用新值

时间:2015-07-03 10:11:38

标签: c# asp.net session webforms master-pages

我正在尝试一些开始变得奇怪的东西,但原则上听起来很正常。基本上我在我的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;

因此,当我单击配置文件页面中的按钮,页面重新加载时,登录的用户将在会话中更新,但主页面加载已经发生,标签显示旧名称。

3 个答案:

答案 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。