2011-10-09 48 views
4

我有一個雙語的MVC 3應用程序,我使用cookies和會話來保存Global.aspx.cs文件中Session_start方法中的「Culture」,但直接在它之後,會話爲空。HttpContext.Current.Session在MVC 3應用程序中爲空

這是我的代碼:

protected void Session_Start(object sender, EventArgs e) 
    { 
     HttpCookie aCookie = Request.Cookies["MyData"]; 

     if (aCookie == null) 
     { 
      Session["MyCulture"] = "de-DE"; 
      aCookie = new HttpCookie("MyData"); 
      //aCookie.Value = Convert.ToString(Session["MyCulture"]); 
      aCookie["MyLang"] = "de-DE"; 
      aCookie.Expires = System.DateTime.Now.AddDays(21); 
      Response.Cookies.Add(aCookie); 
     } 
     else 
     { 
      string s = aCookie["MyLang"]; 
      HttpContext.Current.Session["MyCulture"] = aCookie["MyLang"]; 
     } 
} 

和第二次它進入「else子句」,因爲cookie存在;在我的過濾器中,當它嘗試設置culutre時,Session["MyCulture"]爲空。

public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["MyCulture"].ToString()); 
     System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(HttpContext.Current.Session["MyCulture"].ToString()); 
    } 
+1

正確答案的相關問題:[在MVC中運行任何控制器操作之前調用會話](http://stackoverflow.com/questions/3263936/calling-the-session-before-any-controller-action-is -run-in-mvc) @Darin [已發佈此解決方案](http://stackoverflow.com/questions/7705802/httpcontext-current-session-is-null-in-mvc-3-appplication/7705818# 7705818)只是添加它作爲參考。 –

回答

12

爲什麼在ASP.NET MVC應用程序中使用HttpContext.Current從來沒有使用它。即使在傳統的ASP.NET webforms應用程序中,這也是邪惡的,但在ASP.NET MVC中,這是一個讓這個漂亮的Web框架充滿樂趣的災難。

此外,請確保您在嘗試使用它之前先測試該值是否存在於會話中,因爲我懷疑您的情況並非HttpContext.Current.Session爲空,而是HttpContext.Current.Session["MyCulture"]。所以:

public void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var myCulture = filterContext.HttpContext.Session["MyCulture"] as string; 
    if (!string.IsNullOrEmpty(myCulture)) 
    { 
     Thread.CurrentThread.CurrentUICulture = new CultureInfo(myCulture); 
     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(myCulture); 
    } 
} 

因此,也許你的問題的根源在於Session["MyCulture"]沒有正確的方法Session_Start初始化。

+0

非常感謝, 是的問題的根源是aCookie不是null,但我無法獲得它的價值。因爲第一次(當我刪除瀏覽器的所有cookie)和cookie是空的,我沒有得到問題,會話不爲空。 – user217648

+2

你說這是邪惡的,永遠不要使用。謹慎地闡述替代方案? – Megacan

+5

@Megacan,我的答案是:'filterContext.HttpContext.Session'而不是'HttpContext.Current.Session'。 –

相關問題