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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

我知道如何获得当前控制器的名称。

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

但有没有什么办法让某个类中的当前控制器实例(不是在一个动作中,而不是在一个视图中)?

提问于
用户回答回答于

默认情况下,只能使用视图访问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"];
    }
}

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

用户回答回答于

如果我正在做的事情对整个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,也有类似的简单方法来传输类。

扫码关注云+社区