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

xra*_*inx 23 asp.net-mvc session

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

Session["SessionKey1"]
Run Code Online (Sandbox Code Playgroud)

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

tva*_*son 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"];
            ...
        }
   }
Run Code Online (Sandbox Code Playgroud)

  • 嘿嘿,在我读完答案+1之前,我从未完全"得到"依赖注入一词 (5认同)
  • 我相信尼克的答案(下面)必须是正确的答案.这是直截了当的,并没有要求我注入更多的依赖... (2认同)

Nic*_*rdi 24

你只需要通过HttpContext类似的方式调用它:

HttpContext.Current.Session["MyValue"] = "Something";
Run Code Online (Sandbox Code Playgroud)

  • 原始海报从未询问过测试.他问他如何参加会议. (17认同)
  • 仅供参考 - 框架设计人员将HttpSessionStateBase和HttpContextBase引入到框架的较新版本中,以及为什么可以通过修改控制器上下文来更改控制器中的HttpContext.它可以更轻松地对您的操作进行单元测试. (2认同)