我知道如何获取当前的控制器名称
HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
但是有没有办法让当前的控制器实例在某个类中(不是在一个动作中而不是在一个视图中)?
解决方法
默认情况下,您只能使用ControllerContext.Controller访问控制器内的当前Controller,或者使用ViewContext.Context访问视图内的Controller.要从某个类访问它,您需要实现一个自定义的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"]; } }