为什么在Controllers的构造函数中Session为null?可以从Action方法中访问它。据推测,由于MVC路由框架负责更新Controller,因此它当时还没有(重新)实例化Session。
有谁知道这是否是设计使然,为什么?
[我已经设法通过使用惰性加载模式来解决此问题。]
Answers:
Andrei是正确的-它为null,因为在ASP.NET MVC框架下运行时,未按预期构造控制器类时会设置HttpContext(因此是HttpContext.Session),但稍后会设置(“注入”)通过ControllerBuilder类。如果您想更好地了解生命周期,可以下拉ASP.NET MVC框架(源可用),或参考:此页面
如果您需要访问Session,则一种方法是重写“ OnActionExecuting”方法并在那里进行访问,因为届时它将可用。
但是,正如Andrei所建议的那样,如果您的代码依赖于Session,则可能难以编写单元测试,因此也许您可以考虑将Session封装在一个帮助器类中,然后可以将其换成其他非在单元测试下运行时为Web版本,因此将控制器与Web分离。
除了此处的其他答案外,虽然Controller.Session
未在构造函数中填充,但您仍可以通过以下方式访问会话:
System.Web.HttpContext.Current.Session
标准警告,这可能会降低控制器的可测试性。
System.Web.HttpContext.Current.Session
的也是null
VS2019 MVC实例。
该会话将在生命周期的后期注入。为什么仍然需要在构造函数中使用会话?如果需要将其用于TDD,则应将会话包装到一个可模拟的对象中。
这个答案可能对某些人有用
如果我们重写Initialize方法,则必须使用请求上下文来初始化基类:base.Initialize(requestContext);
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
}
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
。