Эквивалент контроллера HttpContext.Current в ASP.NET MVC

Я хотел бы получить доступ к текущему исполняемому контроллеру, чтобы я мог переложить возврат соответствующего ActionResult на вспомогательный метод. С этой целью я ищу эквивалент того, что я думал бы, было бы ControllerContext.Current, но это не так. Спасибо!

Изменить для пояснения: у меня есть общий элемент управления формы, который основан на JavaScript, но я бы хотел добавить опцию, чтобы он работал с noscript. На данный момент мой контроллер устанавливает ViewData.Model в JSON-ified Models.FormResponse.

Этот FormReponse настроен с учетом статуса поста и всех сообщений об ошибках, которые были сгенерированы, поэтому я бы хотел метод GetActionResult(), который выполняет проверку script/noscript (скрытый ввод формы) и любой из них:

  1. Устанавливает модель в JSONed FormResponse и возвращает View(), или
  2. Сериализует FormResponse для Session и возвращает Redirect().

Поскольку это, очевидно, меняет возвращаемое значение, и я не хочу делать проверку каждый раз сам, мне нужно вызвать View или Redirect из метода GetActionResult FormResponse, чтобы вызвать это как:

return formResponse.GetActionResult();

Я знаю, что с более космонавтическим дизайном это можно сделать еще более надежным, но поскольку опция noscript на данный момент не является основной функцией, мне просто нужно найти быстрое решение, которое не сломало бы другие вещи.

Обновление № 2

Следующее, реализованное в классе ActionResult, делает эту работу за меня. Спасибо CVertex!

public override void ExecuteResult(ControllerContext context)
    {
        if (CMSEnvironment.NoScript)
        {
            Oracle.Response.Redirect(Oracle.Request.UrlReferrer.ToString(), true);
        }

        context.Controller.ViewData.Model = _model.ToJSON();

        new ViewResult()
        {
            ViewName = Areas.Site.Helpers.SharedView.Service,
            ViewData = context.Controller.ViewData
        }.ExecuteResult(context);
    }

2 ответа

Решение

Статика плоха для тестируемости и очень не рекомендуется в MVC.

Почему вы хотите получить доступ к текущему контроллеру и методу действия?

Лучший способ сделать это - реализовать собственный ActionFilter. Это дает вам возможность перехватывать запросы до или после выполнения методов действий.

РЕДАКТИРОВАТЬ: перехватывая результат внутри OnActionExecuted фильтра, вы можете выполнять проверки noscript/script и соответственно изменять ваши ViewData для использования представлением. Внутри OnActionExecuted вы также можете выполнять проверку noscript и иметь полный контроль над окончательным ActionResult или ViewData, как вам угодно.

Или вы можете написать свой собственный ActionResult, который принимает все эти решения. Итак, ваше действие контроллера в конечном итоге делает

return new MyActionResult(format_and_view_agnostic_model_object);

Похоже, нет способа перейти к текущему контроллеру из потока. То есть вы можете получить ControllerBuilder и MvcHttpHandler, но ни один из них не позволит вам получить доступ к экземпляру контроллера, который использует обработчик.

Другие вопросы по тегам