2015-04-28 45 views
0

我正在開發一個ASP MVC網站,但我遇到了Session對象的麻煩。Session對象在asp mvc中總是返回null?

我有這個類管理會話,與屬性,用於存儲語言:

公共類SessionManager {

public static string Language 
    { 
     get 
     {    

      object language = GetSession("LANGUAGE"); 

      if (language != null) 
      { 
       return language as string; 
      } 
      return "EN"; 

     } 
     set 
     {    
      SetSession("LANGUAGE", value);  
     } 
    } 

    //methods for creating session objects 

    private static bool SetSession(string key, object value) 
    { 
     if (HttpContext.Current != null && HttpContext.Current.Session != null) 
     { 
      HttpContext.Current.Session[key] = value; 
      return true; 
     } 
     return false; 
    } 

    private static object GetSession(string key) 
    { 
     if (HttpContext.Current != null && HttpContext.Current.Session != null) 
     { 
      return HttpContext.Current.Session[key]; 
     } 
     return null; 
    } 

}

當我想改變我所說的語言一種來自HomeController 的設置新語言的方法:

public void SetLanguage(string language) 
    {      
     SessionManager.Language = language; 

    } 

但問題是Session不存儲新值,它總是在SessionManager類中返回null。 爲什麼它是空的?請幫忙!

回答

0

靜態類和靜態實例字段在asp.net mvc中的所有請求之間共享。會話應該是每個用戶唯一的。這意味着您應該在會話範圍內避免使用靜態關鍵字

還要記住,在應用程序池回收之前,不會從內存中清除靜態實例。這可能會導致內存使用問題。

我試過你的代碼並找出工作方法。 返工SessionsManager例如

public class SessionManager 
{ 
    private HttpContextBase _context; 

    public SessionManager(HttpContextBase context) 
    { 
     _context = context; 
    } 

    public string Language 
    { 
     get 
     { 

      object language = GetSession("LANGUAGE"); 

      if (language != null) 
      { 
       return language as string; 
      } 
      return "EN"; 

     } 
     set 
     { 
      SetSession("LANGUAGE", value); 
     } 
    } 

    private bool SetSession(string key, object value) 
    { 
     if (_context != null && _context.Session != null) 
     { 
      _context.Session[key] = value; 
      return true; 
     } 
     return false; 
    } 

    private object GetSession(string key) 
    { 
     if (_context != null && _context.Session != null) 
     { 
      return _context.Session[key]; 
     } 
     return null; 
    } 
} 

你可以使用你的經理這樣

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var sm = new SessionManager(HttpContext); 
     ViewBag.Language = sm.Language; 
     return View(); 
    } 

    [HttpGet] 
    public ActionResult SetRu() 
    { 
     var sm = new SessionManager(HttpContext); 
     sm.Language = "Russian"; 
     return RedirectToAction("Index"); 
    } 

    [HttpGet] 
    public ActionResult SetUa() 
    {    
     var sm = new SessionManager(HttpContext); 
     sm.Language = "Ukrainian"; 
     return RedirectToAction("Index"); 
    } 
} 

此代碼工作正常,滿足您需要

+0

所以,我應該怎麼辦? – inna

+0

每次當您想要獲取/設置會話數據時,從您的方法中刪除靜態並創建一個SessionManager類的實例 – dimonser

+0

我也試過了,但它仍然是空的:( – inna