ASP.NET MVC - 如何在Controller和Views之外的位置访问会话数据

时间:2009-04-09 17:21:28

标签: asp.net-mvc session

我们可以在控制器和视图中访问会话数据,如下所示:

Session["SessionKey1"]

如何从控制器或视图以外的类访问会话值?

5 个答案:

答案 0 :(得分:33)

我使用依赖注入并将HttpContext(或只是会话)的实例传递给需要访问Session的类。另一种方法是引用HttpContext.Current,但这会使测试更难,因为它是一个静态对象。

   public ActionResult MyAction()
   {

       var foo = new Foo( this.HttpContext );
       ...
   }


   public class Foo
   {
        private HttpContextBase Context { get; set; }

        public Foo( HttpContextBase context )
        {
            this.Context = context;
        }

        public void Bar()
        {
            var value = this.Context.Session["barKey"];
            ...
        }
   }

答案 1 :(得分:23)

您只需要通过HttpContext调用它,如下所示:

HttpContext.Current.Session["MyValue"] = "Something";

答案 2 :(得分:1)

这是我针对此问题的解决方案版本。请注意,我也使用依赖注入,唯一的主要区别是通过Singleton访问“session”对象

private iSession _Session;

private iSession InternalSession
{
    get
    {

        if (_Session == null)
        {                
           _Session = new SessionDecorator(this.Session);
        }
        return _Session;
    }
}

这是SessionDecorator类,它使用Decorator模式围绕接口包装会话:

public class SessionDecorator : iSession
{
    private HttpSessionStateBase _Session;
    private const string SESSIONKEY1= "SESSIONKEY1";
    private const string SESSIONKEY2= "SESSIONKEY2";

    public SessionDecorator(HttpSessionStateBase session)
    {
        _Session = session;
    }

    int iSession.AValue
    {
           get
        {
            return _Session[SESSIONKEY1] == null ? 1 : Convert.ToInt32(_Session[SESSIONKEY1]);
        }
        set
        {
            _Session[SESSIONKEY1] = value;
        }
    }

    int iSession.AnotherValue
    {
        get
        {
            return _Session[SESSIONKEY2] == null ? 0 : Convert.ToInt32(_Session[SESSIONKEY2]);
        }
        set
        {
            _Session[SESSIONKEY2] = value;
        }
    }
}`

希望这会有所帮助:)

答案 3 :(得分:0)

我自己没有这样做,但来自Chad Meyer博客的这个样本可能有所帮助(来自这篇文章:http://www.chadmyers.com/Blog/archive/2007/11/30/asp.net-webforms-and-mvc-in-the-same-project.aspx

[ControllerAction]
public void Edit(int id)
{
    IHttpSessionState session = HttpContext.Session;

    if (session["LoggedIn"] == null || ((bool)session["LoggedIn"] != true))
        RenderView("NotLoggedIn");

    Product p = SomeFancyDataAccess.GetProductByID(id);

    RenderView("Edit", p);
}

答案 4 :(得分:0)

我还会将所有会话变量包装到单个类文件中。这样您就可以使用intelliSense来选择它们。这减少了代码中需要为会话指定“字符串”的步数。