2009-03-01 4 views
3

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

Редактировать для пояснения: У меня есть общий элемент управления формой, основанный на JavaScript, но я бы хотел добавить параметр, чтобы он работал с noscript. В настоящий момент мой контроллер устанавливает ViewData.Model в JSON-ified Models.FormResponse <T>.

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

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

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

return formResponse.GetActionResult(); 

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

Update # 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); 
    } 
+0

Где вы хотите этот доступ, на ваш взгляд? –

+0

Что такое общий контроль формы? Это ViewUserControl ? – CVertex

ответ

4

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

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

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

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

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

return new MyActionResult(format_and_view_agnostic_model_object); 
1

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

Смежные вопросы