前一陣子筆者因為工作案子需要使用ASP.NET MVC來寫網站,雖然之前沒有接觸過ASP,不過網頁後端概念是一樣的,所以邊寫邊學努力把案子完成
當然有很多架構上還是不一樣的,畢竟換個語言就是要重學一些東西,一開始遇到的就是session問題,我希望能在一個獨立class使用靜態的方法處理session,剛開始找到的資料,都只能在Action中使用session,真的很不方便,後來發現了方法可以在獨立class中取得session
System.Web.HttpContext.Current.Session["loginId"]
不過老實說,好長一大串,用起來很不方便,並且key的部分沒有統一的話,以後就維護找到崩潰了,型態不確定也是一個問題,好家在,stackoverflow是開發人員的好朋友,我找到了這一篇中的一個解法,完全符合我的需要啊,真是太神了,其中核心程式碼如下:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
主要原理是把自訂的物件Current存入session當中,並且只使用一個特定的key,而該物件是靜態的,所以隨時都可以從任意地方存取,第一次取得時,會自動建立好物件存入session,又因為C#物件是call by reference,所以你在修改Current時,也等於在修改session中的物件,因為都指向同一塊記憶體位置
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
這個方法解決了型態和Key值的問題,使用也很簡單,並且可以定義預設值,不用再判斷null或是該key是否存在了,只能說想出來的人真的很有巧思,也願意分享,所以我立馬就將這個方法用在專案中囉,希望對於看到這篇文章的你有點幫助
後續更新: 筆者使用.Net 5後,此篇的做法失效了,因此又寫了另一篇 [ASP.NET 5]又一篇Session的使用,歡迎前往參考
參考來源