我知道如何获取当前控制器的名称
HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
但是有没有办法在某个类中(不是在操作或视图中)获取当前的控制器实例?
我知道如何获取当前控制器的名称
HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
但是有没有办法在某个类中(不是在操作或视图中)获取当前的控制器实例?
默认情况下,您只能在控制器中使用ControllerContext.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"];
}
}
但是我会找到另一种方法来传递控制器实例给我的类,而不是使用这个“hacky”的解决方法。
如果我所做的对整个Asp.Net页面生命周期/任何东西有害,请有人指出我的错误,但是你肯定可以做到这一点:
在控制器中
ViewBag.CurrentController = this;
在视图中
var c = ViewBag.CurrentController;
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null);