Эквивалент контроллера HttpContext.Current в ASP.NET MVC - PullRequest
3 голосов
/ 01 марта 2009

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

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

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

  1. Устанавливает модель в JSONed FormResponse и возвращает View (), или
  2. Сериализует FormResponse для сеанса и возвращает 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 ]

4 голосов
/ 01 марта 2009

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

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

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

EDIT: Перехватывая результат внутри OnActionExecuted фильтра, вы можете выполнять проверки noscript / script и соответственно изменять ваши ViewData для использования представлением. Внутри OnActionExecuted вы также можете выполнить проверку noscript и получить полный контроль над окончательным ActionResult или ViewData, как вам угодно.

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

return new MyActionResult(format_and_view_agnostic_model_object);
1 голос
/ 01 марта 2009

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

...