[英]Changing Session in page postpack and using new value in Master Page
我正在嘗試開始變得怪異的東西,但原則上聽起來很正常。 基本上,我的ASP.NET應用程序中有一個MasterPage,負責在所有頁面中顯示通常的Login / Logout框。 用戶登錄后,將顯示通常的“ Welcome {Name}”。
登錄的用戶詳細信息來自會話。
現在,我有了一個個人資料頁面,用戶可以在其中更改他/她的姓名,這很正常。 編輯后,作為頁面回發的一部分,我使用新的用戶詳細信息更新了會話。
我希望看到的是,如果用戶更改了“歡迎”消息,則會顯示新名稱。
我已經在生命周期中進行了一些研究,實際上,鑒於可以在Page_Load中訪問會話,然后在UpdateButton_Click中對其進行更新,因此在更改會話之前,歡迎消息已經更新。
是否有人對如何強制刷新母版頁有任何想法,或者在設計方面還有其他需要考慮的方面嗎?
我也嘗試將“登錄/注銷”框放入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;
因此,當我單擊配置文件頁面中的按鈕時,頁面將重新加載,登錄的用戶將在會話中更新,但已經發生了母版頁面加載,並且標簽顯示了舊名稱。
不要在Page_load中設置控件,而是直接在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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.