C# 在控制器类外使用会话

C# 在控制器类外使用会话,c#,.net,asp.net-mvc,asp.net-mvc-4,session,C#,.net,Asp.net Mvc,Asp.net Mvc 4,Session,我正在考虑实现一个静态的SessionHelper类,在这个类中,我希望在会话中保存一些数据 但似乎不可能在控制器类之外使用会话对象。对吧? 也许是我错了。。。即,此链接是否为解决方案 请告诉我 无论如何,现在我不能引用模型文件夹中的类中的Session对象 public static class SessionHelper { public static bool ShowSuccessPopup { get {

我正在考虑实现一个静态的SessionHelper类,在这个类中,我希望在会话中保存一些数据

但似乎不可能在控制器类之外使用会话对象。对吧?

也许是我错了。。。即,此链接是否为解决方案

请告诉我

无论如何,现在我不能引用模型文件夹中的类中的Session对象

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; }

        }

}

会话
对象仅在请求周期中设置,因此请求周期之外的任何对象都无法访问它(即控制器和视图可以,但型号没有)。如果需要在请求周期之外的某个时间处理会话,那么必须将会话对象作为依赖项注入。但是,使用静态类无法实现这一点。因此,您可以尝试以下方法:

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
}
多亏了克里斯·普拉特

就像另一种选择一样,我要分享我的方法

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; }

        }
    }
请注意,您应该在
BaseController
class上继承
Controller
class 在以后的
Controller
课程中,您可以像

   if (SessionBox.ShowSuccessPopup)
                {
                    SessionBox.ShowSuccessPopup = false;
这里有一些额外的链接,展示了它们之间的区别


酷!您认为我也可以使用这种方法吗
public分部类BaseController:Controller{public SessionBox SessionBox;protected override void OnActionExecuting(ActionExecutingContext filterContext){SessionBox=new SessionBox(filterContext.HttpContext);base.OnActionExecuting(filterContext);}
Where is
public class SessionBox{private HttpContextBase context{get;set;}public SessionBox(HttpContextBase context){this.context=context;}public bool ShowSuccessPopup{get{
我刚刚测试了我的方法,效果很好。但我不确定你的方法是否更好……(无论如何+1000;)