2011-01-25 2 views
18

Я хотел бы знать, как я могу перенаправить запрос внутри конструктора контроллера, если мне это нужно ?.MVC - перенаправление внутри конструктора

Например: Внутри конструктора мне нужно инициализировать объект динамическим значением, в некоторых случаях я не хочу этого делать, и в этом случае я хочу перенаправить в другое место. Точно так же остальная часть конструктора не будет выполняться ни «оригинальным следующим действием».

Как я могу это сделать? Спасибо

EDIT # 1

Первоначально я использовал:

public override void OnActionExecuting(ActionExecutingContext filterContext) 

Там я мог бы перенаправить на какой-либо другой контроллер/действие/URL, но позже во времени, мне нужно изменить мой контроллер, где я инициализирую переменную в его конструкторе и имею некоторый код, который действительно нуждается в перенаправлении запроса: P

Мне тоже нужно это, потому что OnActionExecuting выполняет ПОСЛЕ e контроллер. И в моей логике, там нужно сделать перенаправление.

ответ

45

Выполнение переадресаций внутри конструктора контроллера не является хорошей практикой, поскольку контекст не может быть инициализирован. Стандартная практика заключается в том, чтобы написать собственный атрибут действия и переопределить метод OnActionExecuting и выполнить перенаправление внутри. Пример:

public class RedirectingActionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     if (someConditionIsMet) 
     { 
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "someOther", 
       action = "someAction" 
      })); 
     } 
    } 
} 

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

Таким образом, вы могли бы:

[RedirectingAction] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // This action is never going to execute if the 
     // redirecting condition is met 
     return View(); 
    } 
} 

public class SomeOtherController : Controller 
{ 
    public ActionResult SomeAction() 
    { 
     return View(); 
    } 
} 
+0

ты меня опередил :). – bastijn

+0

спасибо за подсказку, но это то, что я использовал раньше. проверьте EDIT # 1 – Dryadwoods

+0

@emanyalpsid, а затем позвольте мне сказать так: вы не можете перенаправить внутри конструктора контроллера, потому что контекст еще не инициализирован. Вероятно, вы могли бы сделать это внутри метода «Инициализация», но ИМХО вы делаете что-то неправильно, если вам когда-либо понадобится это делать. –

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