Come reindirizzare da OnActionExecuting nel controller di base?


185

Ho provato due modi: Response.Redirect () che non fa nulla, oltre a chiamare un nuovo metodo all'interno del controller di base che restituisce un ActionResult e lo fa restituire RedirectToAction () ... nessuno di questi funziona.

Come posso effettuare un reindirizzamento dal metodo OnActionExecuting?

Risposte:


363
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }

79
Invece di new RedirectResult(url)te potresti anche usare new RedirectToAction(string action, string controller). Potrebbe essere stato aggiunto a MVC dopo aver pubblicato la risposta. La tua soluzione mi ha messo sulla strada giusta comunque.
Manfred,

3
@Pluc - OnActionExecuting si verifica per primo. Se si imposta il context.Result, il reindirizzamento si verifica prima che l'azione venga eseguita. (Verificato da test / debug personali.)
James

39
@Manfred Nota, l'assegnazione deve essere effettuata al metodo (senza new) RedirectToAction:filterContext.Result = RedirectToAction(string action, string controller);
cederlof

1
@Manfred Volevo solo aggiungere che non avresti rinnovato il RedirectToAction. È solo filterContext.Result = RedirectToAction (..)
Sinaesthetic

4
Il nome "RedirectToAction" non esiste nel contesto attuale ??
Dan Hastings,

56

Può essere fatto anche in questo modo:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);

35

Crea una classe separata,

    public class RedirectingAction : ActionFilterAttribute
    {
      public override void OnActionExecuting(ActionExecutingContext context)
      {
        base.OnActionExecuting(context);

        if (CheckUrCondition)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }));
        }
      }
   }

Quindi, quando si crea un controller, chiamare questa annotazione come

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

Preferisco questo oggetto anonimo per ilRouteValueDictionary costruttore in quanto rispecchia il routing altrove in MVC. +1
Codifica andata

3

Se il controller reindirizzato eredita dallo stesso in baseControllercui sovrascriviamo il OnActionExecutingmetodo, si verifica un ciclo ricorsivo. Supponiamo di reindirizzarlo all'azione di accesso del controller dell'account, quindi l'azione di accesso chiamerà il OnActionExecutingmetodo e reindirizzerà alla stessa azione di accesso ancora e ancora ... Quindi dovremmo applicare un OnActionExecutingmetodo di check-in per verificare se la richiesta proviene dallo stesso controller se quindi non reindirizzare nuovamente l'azione di accesso. ecco il codice:

override protetto.

void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() !=     typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
      }
   }
}

1
try {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType ()! = typeof (AccountController)) {filterContext.Result = new RedirectToRouteResult (new RouteValueDictionary {{"controller", "Account"}, {"action", "Login"}} ); }}
abdul ha odiato l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.