2013-12-18 83 views
2

考慮下面的母版或內容頁...............每個用戶都有實例化的類是否唯一?

namespace Intranet 
{ 
    public partial class Site : System.Web.UI.MasterPage 
    { 
     WebSite.Security.Users.CurrentUser currentUser; 

     protected void Page_Init(object sender, EventArgs e) 
     { 
      if (!Page.IsPostBack) 
      { 
       currentUser = new WebSite.Security.Users.CurrentUser(); 
       currentUser = WebSite.Security.Users.GetCurrentUser(currentUser); 
       Label_UserId.Text = currentUser.UserId; 
      } 
     } 
    } 
} 

調用以下............

namespace Intranet 
{ 
    public class WebSite 
    { 
     public class Security 
     { 
      public class Users 
      { 
       public class CurrentUser 
       { 
        public string UserId { get; set; } 
       } 
       public static CurrentUser GetCurrentUser(CurrentUser cu) 
       { 
        cu.UserId = "MethodThatGetsUserId"; 
        return cu; 
       } 
      } 
     } 
    } 
} 

即使幾個不同的用戶同時在頁面上,返回的實例化類'currentUser'是否包含唯一信息?

感謝您的時間和見解。

回答

2

不,這條線:

currentUser = new WebSite.Security.Users.CurrentUser(); 

你正在創建您的母版頁類的新實例。每個request中創建的實例僅在該請求中可用(當然,取決於範圍),除非使用static變量。應用程序中的all users/threads的靜態變量相同。

但是,您真正想要做的是獲取當前用戶。這應該使用HttpContext.Current.UserPage.Current這是一個IPrincipal並應包含填寫您的應用程序的Authenticate_Request方法的信息。

要了解更多關於ASP.NET窗體身份驗證,請參考:http://msdn.microsoft.com/en-us/library/9wff0kyh(v=vs.100).aspx

+0

CurrentUser類的屬性包含更多的字段,然後只是userid(這是填充HttpContext),我想要一個地方設置/獲取所有用戶信息。 – user3071434

3

是的,每個請求甚至會爲每個請求實例化一個新類,而不僅僅是每個用戶。

該類中的靜態字段將被共享,您應該使用會話和應用程序數據在請求或用戶之間共享數據。

+0

因此,當性能是靜態的,我被實例化類的代碼文件,這就是爲什麼用戶ID的正在跨越不同的用戶共享當他們訪問那些稱爲那些靜態屬性的頁面時? 我是如何在頁面生命期間如何存儲和訪問屬性的?我知道我可以使用會話變量,但我喜歡這種方式使用類的intellisense部分。 – user3071434

+0

....並感謝您的快速回復。 – user3071434

+0

@ user3071434只要您傳入會話​​狀態的類是可序列化的,您仍然可以使用強類型類。 –

相關問題