C# 为什么编程实例化控制器中的会话为空?
在我的HomeController中,当调用特定操作时,我可以在调试时看到会话在那里。但是,当HomeController操作以编程方式实例化另一个控制器并访问该控制器上的属性时,该属性尝试访问会话,并且该属性为null 大概是这样的:C# 为什么编程实例化控制器中的会话为空?,c#,.net,session,model-view-controller,C#,.net,Session,Model View Controller,在我的HomeController中,当调用特定操作时,我可以在调试时看到会话在那里。但是,当HomeController操作以编程方式实例化另一个控制器并访问该控制器上的属性时,该属性尝试访问会话,并且该属性为null 大概是这样的: public class HomeController : Controller { public PartialViewResult SomeAction() { // When debugging, I can break h
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
// When debugging, I can break here and
// see the Session in the Immediate Window
var a = new AnotherController();
var b = a.SomeProperty;
}
}
public class AnotherController : Controller
{
public object SomeProperty
{
get
{
// Session is null here
return Session["MyProperty"];
}
}
}
编辑:
不确定这是否重要,但忘了提到SomeAction是通过ajax调用的。由于会话在该操作中可用,我认为这与此无关。手动创建控制器不是一个好主意。您应该重构代码以避免这种情况。将属性移动到服务并注入它。也许您需要创建自定义控制器。手动创建控制器不是一个好主意。您应该重构代码以避免这种情况。将属性移动到服务并注入它。也许您需要创建自定义会话。如果您使用的是会话,您可能可以在任何地方获得它。您不需要实例化另一个控制器来读取它:
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
//you can access the session anywhere
var s = Session["MyProperty"] as YourTypeHere;
}
}
您还可以创建一个静态类来保存一个表示会话名称的常量字符串。如果您正在使用会话,您可能可以在任何地方获取它。您不需要实例化另一个控制器来读取它:
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
//you can access the session anywhere
var s = Session["MyProperty"] as YourTypeHere;
}
}
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
// When debugging, I can break here and
// see the Session in the Immediate Window
var b = SessionHelper.SomeProperty;
}
}
public class SessionHelper
{
public static object SomeProperty
{
get
{
return System.Web.HttpContext.Current.Session["MyProperty"];
}
}
}
您还可以创建一个静态类来保存表示会话名称的const字符串。因为ASP.NET MVC不仅仅是实例化一个控制器,它还通过上下文设置控制器实例,以便访问会话、请求等。@Igor那么您建议我做什么?使用该属性创建另一个类(非控制器)(可能是静态的)您使用的地方:
System.Web.HttpContext.Current.Session[“MyProperty”]
并在SomeAction
中使用该类。您的想法完全错误。控制器永远不会在您自己的代码中使用new AnotherController()创建
。控制器仅作为请求生命周期的一部分创建。因为ASP.NET MVC不仅仅是实例化一个控制器-它使用上下文设置控制器实例,以便访问会话、请求等@Igor那么您建议我怎么做?使用该属性创建另一个类(非控制器)(可能是静态的)您使用的位置:System.Web.HttpContext.Current.Session[“MyProperty”]
并在SomeAction
中使用该类。您的想法完全错误。使用new AnotherController()在您自己的代码中永远不会创建控制器
。控制器仅作为请求生命周期的一部分创建。这对于此项目来说有点过分,但是对于链接来说+1…可能在将来派上用场。对于此项目来说有点过分,但是对于链接来说+1…可能在将来派上用场。
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
// When debugging, I can break here and
// see the Session in the Immediate Window
var b = SessionHelper.SomeProperty;
}
}
public class SessionHelper
{
public static object SomeProperty
{
get
{
return System.Web.HttpContext.Current.Session["MyProperty"];
}
}
}