Asp.net mvc 3 - получить текущий экземпляр контроллера (не только имя) - PullRequest
17 голосов
/ 23 октября 2011

Я знаю, как получить текущее имя контроллера

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

Но есть ли способ получить текущий экземпляр контроллера в некотором классе (не в действии и не в представлении)?

Ответы [ 2 ]

23 голосов
/ 23 октября 2011

По умолчанию вы можете получить доступ только к текущему 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"];
    }
}

Но я бы нашел другой способ передать экземпляр контроллера моему классу вместо этого "хакерского" обходного пути.

0 голосов
/ 20 сентября 2017

Кто-то должен будет исправить меня, если то, что я делаю, наносит ущерб всему жизненному циклу страницы Asp.Net / что угодно, но обязательно вы можете сделать это:

В контроллере

ViewBag.CurrentController = this;

В поле зрения

var c = ViewBag.CurrentController;
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null);

В моем случае у меня был базовый контроллер, который расширяют все контроллеры.В этом базовом контроллере жил статический метод RenderViewToString, и для этого требовался контроллер.Так как я решил, что мог бы просто создать новый экземпляр пустого контроллера в этот момент для c, я просто отправил его в представление в прекрасном контейнере ViewBag, который существует в мире Asp.Net MVC.По причинам, в которые я не мог сейчас войти, я не мог извлечь строку в контроллере и отправить только это обратно в представление (это было тем, что я делал раньше, до изменения требований).

Причина, по которой я это сделалэтот способ используется в других языках, таких как PHP и JS, существуют похожие простые способы передачи классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...