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

Ale*_*dre 17 asp.net-mvc-3

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

HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
Run Code Online (Sandbox Code Playgroud)

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

nem*_*esv 24

默认情况下,您只能使用视图或视图Controller内部访问控制器内的当前内容.要从某个类访问它,您需要实现一个自定义,它在某处存储控制器实例并从那里检索它.例如:ControllerContext.ControllerViewContext.ContextControllerFactoryRequest.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你在你的注册 Application_Start:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Run Code Online (Sandbox Code Playgroud)

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

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

但我会找到另一种方法将控制器实例传递给我的类而不是这种"hacky"解决方法.

  • 您可能应该将HttpContext.Current.Session ["controllerInstance"]更改为HttpContext.Current.Items ["controllerInstance"],因为会话可能会在具有某些配置的数据库中结束. (6认同)