【问题标题】:Asp.net mvc 3- get the current controller instance (not just name)Asp.net mvc 3-获取当前控制器实例(不仅仅是名称)
【发布时间】:2017-10-31 00:27:46
【问题描述】:

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

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

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

【问题讨论】:

  • 在哪里?在模型中?在一个视图中?当然,如果您正在执行某个操作,您可以使用它来引用您的控制器,但我想情况并非如此 :)。
  • 在某个类中(不在动作中也不在视图中)
  • 因为在 MVC 模式中,你一定会在一个动作中,除非你在一些数据模型的方法流或一些助手中。只是为了避免空引用,我会在控制器的类方法中添加一个参数,然后跟踪流程开始的位置并传递它。
  • 你想做什么?我看不出你有什么理由这样做,控制器在那里,所以你可以处理请求,就是这样。

标签: asp.net-mvc-3


【解决方案1】:

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

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

【讨论】:

  • 您可能应该将 HttpContext.Current.Session["controllerInstance"] 更改为 HttpContext.Current.Items["controllerInstance"] 因为会话可能会以某些配置在数据库中结束。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多