2011-01-25 11 views
18

Mi piacerebbe sapere come posso reindirizzare la richiesta all'interno del costruttore del controllore se devo farlo ?.MVC - Reindirizzamento all'interno del Costruttore

Ad esempio: All'interno del costruttore ho bisogno di inizializzare un oggetto con un valore dinamico, in alcuni casi non voglio farlo e in tal caso voglio reindirizzare in qualche altro posto. Allo stesso modo il resto del costruttore non verrà eseguito né la "seguente azione originale".

Come posso farlo? Grazie

EDIT # 1

Inizialmente ho usato:

public override void OnActionExecuting(ActionExecutingContext filterContext) 

Qui ho potuto reindirizzare ad un altro controllore/action/url, ma più avanti nel tempo, avevo bisogno di cambiare la mia controller, dove inizializzo una variabile nel suo costruttore e ho del codice che ha veramente bisogno di reindirizzare la richiesta: P

Ho bisogno di questo anche perché l'esecuzione di OnAction esegue DOPO Costruttore di controller. E nella mia logica, il reindirizzamento deve essere fatto lì.

risposta

45

L'esecuzione di reindirizzamenti all'interno del costruttore del controllore non è una buona pratica poiché il contesto potrebbe non essere inizializzato. Lo standard è di scrivere un attributo di azione personalizzato e sovrascrivere il metodo OnActionExecuting ed eseguire il reindirizzamento all'interno. Esempio:

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" 
      })); 
     } 
    } 
} 

e quindi decorare il controller che si desidera reindirizzare con questo attributo. Fai molta attenzione a non decorare il controller con il quale stai reindirizzando con questo attributo o ti imbatterai in un ciclo infinito.

Così si potrebbe:

[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

mi battuto sul tempo :). – bastijn

+0

grazie per il suggerimento, ma è quello che ho usato prima. controlla EDIT # 1 – Dryadwoods

+0

@emanyalpsid, quindi lascia che lo metta in questo modo: non puoi reindirizzare all'interno del costruttore del controller perché il contesto non è ancora inizializzato. Probabilmente potresti farlo all'interno del metodo 'Initialize' ma IMHO stai facendo qualcosa di sbagliato se hai mai bisogno di farlo. –

Problemi correlati