Asp.net mvc 3-获取当前控制器实例(不只是名称)

时间:2011-10-23 10:30:54

标签: asp.net-mvc-3

我知道如何获取当前控制器名称

HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();

但有没有办法在某个类中获取当前控制器实例(不在动作中而不在视图中)?

2 个答案:

答案 0 :(得分:23)

默认情况下,您只能使用Controller或使用ControllerContext.Controller的视图访问控制器内的当前ViewContext.Context。要从某个类访问它,您需要实现一个自定义ControllerFactory,它将控制器实例存储在某处并从那里检索它。例如Request.Items

public class MyControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        var controller = base.CreateController(requestContext, controllerName);
        HttpContext.Current.Items["controllerInstance"] = controller;
        return controller;
    }
}

然后在Application_Start

中注册
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

您可以稍后获取控制器实例:

public class SomeClass
{
    public SomeClass()
    {
        var controller = (IController)HttpContext.Current.Items["controllerInstance"];
    }
}

但我会找到另一种方法将控制器实例传递给我的班级而不是这种“hacky”解决方法。

答案 1 :(得分:0)

如果我正在做的事情对整个Asp.Net页面生命周期有害,那么有人必须纠正我/无论你做什么都可以做到:

在控制器中

ViewBag.CurrentController = this;

在视图中

var c = ViewBag.CurrentController;
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null);

在我的情况下,我有一个所有控制器扩展的基本控制器。在那个基本控制器中有一个名为RenderViewToString的静态方法,它需要一个控制器。由于我想我可以在此时为c实例化一个空控制器的新实例,我只是将它发送到Asp.Net MVC世界中存在的可爱ViewBag容器中的视图。由于我现在无法进入的原因,我无法检索控制器中的字符串并将其发送回视图(这是我在更改要求之前所做的事情。)

我这样做的原因是在PHP和JS等其他语言中,有类似的简单方法来传递类。