好吧,我有這個單身類的網絡類,它使用會話來維護狀態。我最初認爲我將不得不在每個「集合」上操作會話變量,以便在會話中更新新值。不過,我嘗試使用它,不知何故,它記住了狀態。即使會話未在屬性設置器中更新,此類Singleton類web類如何保持會話數據?
例如,如果一個頁面上運行此代碼:
UserContext.Current.User.FirstName = "Micah";
,並運行在不同的瀏覽器選項卡上的代碼,名字是正確顯示:
Response.Write(UserContext.Current.User.FirstName);
誰能告訴我(證明)該數據如何在會話中持續存在?這裏是類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
public class UserContext
{
private UserContext() { }
public static UserContext Current
{
get
{
if (System.Web.HttpContext.Current.Session["UserContext"] == null)
{
UserContext uc = new UserContext();
uc.User = new User();
System.Web.HttpContext.Current.Session["UserContext"] = uc;
}
return (UserContext)System.Web.HttpContext.Current.Session["UserContext"];
}
}
private string HospitalField;
public string Hospital
{
get { return HospitalField; }
set
{
HospitalField = value;
ContractField = null;
ModelType = null;
}
}
private string ContractField;
public string Contract
{
get { return ContractField; }
set
{
ContractField = value;
ModelType = string.Empty;
}
}
private string ModelTypeField;
public string ModelType
{
get { return ModelTypeField; }
set { ModelTypeField = value; }
}
private User UserField;
public User User
{
get { return UserField; }
set { UserField = value; }
}
public void DoSomething()
{
}
}
public class User
{
public int UserId { get; set; }
public string FirstName { get; set; }
}
我加入這一塊手錶,並可以看到會話變量肯定是被設置的地方:
(UserContext)System.Web.HttpContext.Current.Session["UserContext"];
只要二傳手被稱爲會話變量被即時更新:
set
{
HospitalField = value; //<--- here
ContractField = null;
ModelType = null;
}
我可以看到如何檢索會話變量,我的困惑是如何設置會話變量。當我運行UserContext.Current.User.FirstName =「Micah」;我沒有看到它被放回到會話var中的任何地方。會話設置的唯一時間是創建沒有數據的新實例。 – 2010-06-08 14:20:21
我不確定你是否明白我在問什麼。只要代碼調用「HospitalField = value」;會議從無效到填充醫院名稱。在該行執行之前,會話變量中的所有字段均爲空。會議在哪裏設置? 代碼設置會話var的唯一地方是當它填充了一個帶有空字段的新對象時。 – 2010-06-09 03:24:01
當您調用「UserContext.Current.Hospital = value;」時,首先調用獲取器UserContext.Current(並在Session中創建對象),然後調用「Hospital」設置器,此時該對象已創建在會議中。你是否嘗試過使用調試器?您可能需要更改您的VS Debug設置,以便它進入屬性以查看發生了什麼。 – Joe 2010-06-09 04:25:33