使用Session类的Controller

时间:2013-10-23 18:57:36

标签: c# .net asp.net-mvc asp.net-mvc-4 session

我正在考虑实施类似静态 SessionHelper 类的内容,我希望在会话中保留一些数据。

但似乎不可能在 Controller 类中使用 Session 对象。正确?

或者可能是我错了... I.e.此链接是解决方案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; }

        }

}

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

感谢 Chris Pratt

就像另一种选择,我会分享我的方法。

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

        }
    }

请注意,您应该在Controller类上继承BaseController类 然后在Controller课程中你可以做

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

以下是显示

之间差异的额外链接

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

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