我知道如何获取当前控制器名称
HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
但有没有办法在某个类中获取当前控制器实例(不在动作中而不在视图中)?
答案 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等其他语言中,有类似的简单方法来传递类。