【问题标题】:Using Session out of the Controller class在 Controller 类之外使用 Session
【发布时间】:2013-11-02 05:26:09
【问题描述】:

我正在考虑实现类似于静态 SessionHelper 类的东西,我想在 Session 中保留一些数据。

但似乎不可能在 Controller 类之外使用 Session 对象。对吧?

或者可能是我错了...即这个链接是解决方案吗ASP.NET MVC - How to access Session data in places other than Controller and Views

请告诉我!

无论如何,现在我无法引用该类中的 Session 对象,该类位于 Models 文件夹中。

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

        }

}

【问题讨论】:

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


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 酷!你认为我也可以使用这种方法吗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 { 在哪里
    • 我刚刚测试了我的方法,它工作正常。但我不确定你的方法是否更好......(无论如何+1000;))
    【解决方案2】:

    感谢 克里斯·普拉特

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

    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类上继承Controller类 稍后在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-21
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多