为什么在控制器的构造函数中会话是空的?可以从Action方法访问它。大概是因为MVC路由框架负责创建一个控制器,所以它当时并没有(重新)实例化会话。
有没有人知道这是不是故意的,如果是的话,为什么?
我已经设法通过使用延迟加载模式绕过了这个问题。
发布于 2009-07-31 13:09:13
Andrei是对的-它是空的,因为当在ASP.NET MVC框架下运行时,在构建控制器类时不会设置HttpContext (因此也就是HttpContext.Session),而是稍后由ControllerBuilder类设置(“注入”)。如果您想更好地理解生命周期,可以下载ASP.NET MVC框架(源代码可用),或者参阅:this page
如果您需要访问会话,那么一种方法是覆盖"OnActionExecuting“方法并在那里访问它,因为它将在那时可用。
然而,正如Andrei建议的那样,如果你的代码依赖于会话,那么编写单元测试可能会很困难,所以也许你可以考虑将会话包装在一个帮助器类中,然后当在单元测试下运行时,这个帮助器类可以换出一个不同的非web版本,从而将你的控制器与web解耦。
发布于 2012-09-28 15:12:02
除了这里的其他答案之外,虽然构造函数中没有填充Controller.Session
,但您仍然可以通过以下方式访问会话:
System.Web.HttpContext.Current.Session
标准的警告是,这可能会降低控制器的可测试性。
发布于 2009-06-19 23:31:38
会话被注入到生命周期的后期。为什么你需要构造函数中的会话呢?如果TDD需要它,那么应该将会话包装到一个可mockable对象中。
https://stackoverflow.com/questions/889516
复制相似问题