2013-10-23 63 views
4

我想實現類似靜態SessionHelper類我想保留一些數據在會話使用會話出控制器類

但似乎不可能使用會話對象了控制器類的。對?

或者可能是我錯了......也就是說,是此鏈接解決方案ASP.NET MVC - How to access Session data in places other than Controller and Views

請讓我知道!

反正現在我不能引用會議對象在類生活在模式文件夾。

public static class SessionHelper 
{ 
public static bool ShowSuccessPopup 
     { 
      get 
      { 
       if (Session["ShowSuccessPopup"] == null) 
       { 
        Session["ShowSuccessPopup"] = false; 
        return false; 
       } 
       else 
       { 
        var result = (bool)Session["ShowSuccessPopup"].ToString(); 
        return result; 
       } 
      } 

      set {Session["ShowSuccessPopup"] = value; } 

     } 

} 

回答

3

Session對象僅在請求週期的設定,因此請求週期之外的任何內容將不能訪問它(即控制器和視圖都很好,但沒有型號)。如果您需要在請求循環之外的某個地方使用會話,那麼您必須將Session對象注入爲依賴項。但是,你無法用靜態類來完成這個任務。所以,你可能會改爲嘗試類似:

public class SessionHelper 
{ 
    private HttpSessionState session; 

    public SessionHelper (HttpSessionState session) 
    { 
     this.session = session; 
    } 

    public bool ShowSuccessPopup { ... } 
} 

或者,你可以與僅僅注入到會話實際的方法分別獲得通過,但你將無法繼續使用屬性:

public static bool ShowSuccessPopup (HttpSessionState session) 
{ 
    // do something with session 
} 
+0

酷!你認爲我也可以使用這種方法:公共部分類BaseController:控制器 公共SessionBox SessionBox; protected override void OnActionExecuting(ActionExecutingContext filterContext) SessionBox = new SessionBox(filterContext.HttpContext); 基地。OnActionExecuting(filterContext); }' –

+0

'公共類SessionBox {0}私人HttpContextBase上下文{get;組; } public SessionBox(HttpContextBase context) this.context = context; } 公共BOOL ShowSuccessPopup { 得到 { ' –

+0

我只是測試我的方法,它是工作的罰款。但我不確定你的方法是否更好....(無論如何+1000;)) –

1

由於克里斯·普拉特

就像一個選擇,我會分享我的方法。

public partial class BaseController : Controller 
    { 
     public SessionBox SessionBox; 

     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      SessionBox = new SessionBox(filterContext.HttpContext); 
      base.OnActionExecuting(filterContext); 
     } 
} 


public class SessionBox 
    { 
     private HttpContextBase context { get; set; } 

     public SessionBox(HttpContextBase context) 
     { 
      this.context = context; 
     } 

     public bool ShowSuccessPopup 
     { 
      get 
      { 
       if (context.Session["ShowSuccessPopup"] == null) 
       { 
        context.Session["ShowSuccessPopup"] = false; 
        return false; 
       } 
       else 
       { 
        var result = Convert.ToBoolean(context.Session["ShowSuccessPopup"].ToString()); 
        return result; 
       } 
      } 

      set { context.Session["ShowSuccessPopup"] = value; } 

     } 
    } 

請注意,您應該inheritine上BaseController類 和Controller類以後在Controller類,你可以不喜歡

if (SessionBox.ShowSuccessPopup) 
       { 
        SessionBox.ShowSuccessPopup = false; 

以下是演示的差異額外的鏈接

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.aspx

and

http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx