代码之家  ›  专栏  ›  技术社区  ›  hugoware

ASP.net MVC中控制器实例上的HttpContext为空

  •  26
  • hugoware  · 技术社区  · 17 年前

    这可能不是使用控制器的正确方法,但我确实注意到了这个问题,并且还没有找到解决方法。

    public JsonResult SomeControllerAction() {
    
        //The current method has the HttpContext just fine
        bool currentIsNotNull = (this.HttpContext == null); //which is false    
    
        //creating a new instance of another controller
        SomeOtherController controller = new SomeOtherController();
        bool isNull = (controller.HttpContext == null); // which is true
    
        //The actual HttpContext is fine in both
        bool notNull = (System.Web.HttpContext.Current == null); // which is false        
    
    }
    

    我注意到控制器上的HttpContext不是System.Web.HttpContext.Current中的“实际”HttpContext。

    5 回复  |  直到 13 年前
        1
  •  63
  •   hugoware    17 年前

    现在我要做以下几点。这似乎是一个可以接受的解决方案。。。

    public new HttpContextBase HttpContext {
        get {
            HttpContextWrapper context = 
                new HttpContextWrapper(System.Web.HttpContext.Current);
            return (HttpContextBase)context;                
        }
    }
    

    将其添加到这些控制器从中继承的控制器类中。

        2
  •  24
  •   Brad Wilson    17 年前

    控制器的设计不是像您现在这样手动创建的。听起来您真正应该做的是将您拥有的任何可重用逻辑放入helper类中。

        3
  •  5
  •   Paco    17 年前

    ControllerContext中的HttpContext为null,因为在创建控制器时未设置它。控制器的构造函数未分配此属性,因此它将为null。通常,HttpContext设置为ControllerBuilder类的HttpContext。控制器由ControllerBuilder类创建,后跟DefaultControllerFactory。当您想要创建自己的控制器实例时,可以将控制器的ExecuteMethod与您自己的ControllerContext一起使用。您不想这样做,因为这是一个真正的应用程序。当你对这个框架有了更多的经验后,你会找到你想要的合适的方法。当您在单元测试中需要ControllerContext时,您可以使用模拟框架来模拟ControllerContext,也可以对其进行类伪造。

    您可以在上的asp.net mvc中找到请求流的模型 this blog .

    当您刚接触Asp.net mvc时,下载源代码并读取跟踪请求处理路径的信息是值得的。

        4
  •  0
  •   mmacaulay    17 年前

    您是否希望使用控制器的某些功能?或者让控制器执行操作?

    如果是前者,也许这是一些应该拆分成另一个类的代码。如果是后者,您只需让该控制器执行特定操作即可:

    
    return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });
    
    
        5
  •  0
  •   Ben Scheirman    17 年前

    您使用的是控制器工厂吗?如果是,您如何注册组件?