2012-03-23 9 views

risposta

18

È possibile utilizzare filterContext.Result per questo. Esso dovrebbe essere simile a questo:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    //Check your condition here 
    if (true) 
    { 
     //Create your result 
     filterContext.Result = new EmptyResult(); 
    } 
    else 
     base.OnActionExecuting(filterContext); 
} 
+0

Perché si salta la base.OnActionExecuting quando la condizione è vera? Nel mio caso ho bisogno di farlo funzionare prima di poter impostare il risultato. – xr280xr

33

Vedi il mio campione di download e articolo di MSDN Filtering in ASP.NET MVC.

È possibile annullare l'esecuzione del filtro nei metodi OnActionExecuting e OnResultExecuting impostando la proprietà Result su un valore non null.

Tutti i filtri in sospeso OnActionExecuted e OnActionExecuting non vengono richiamati e l'invoker non chiama il metodo OnActionExecuted per il filtro annullato o per i filtri in sospeso.

Il filtro OnActionExecuted per i filtri eseguiti in precedenza verrà eseguito. Verranno eseguiti tutti i filtri OnResultExecutingandOnResultExecuted.

Il seguente codice dal campione mostra come restituire una specifica ActionResult quando una certa condizione è soddisfatta in OnActionExecuting:

if (filterContext.RouteData.Values.ContainsValue("Cancel")) 
{ 
    filterContext.Result = new RedirectResult("~/Home/Index"); 
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index"); 
} 
+2

Si noti che se si dispone di più di un filtro e l'ordine dei filtri è importante, è necessario specificare il parametro "Ordine" quando si registra il filtro in modo da poter controllare l'ordine di esecuzione come descritto da Rick nei dettagli su come il risultato La proprietà filterContext.Result si comporta. –

+0

Buon punto Nick - ma vedi la mia sezione Ordine filtri - la proprietà dell'ordine si applica solo ai filtri della stessa classe. L'autenticazione esegue sempre prima, l'eccezione, l'ultima. – RickAndMSFT

3

È possibile utilizzare il seguente codice qui.

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ... 
    if (needToRedirect) //your condition here 
    { 
     ... 
     filterContext.Result = new RedirectToAction(string action, string controller) 
     return; 
    } 
    ... 
} 

RedirectToAction ti reindirizzerà l'azione specifica in base alla condizione.

+0

RedirectToAction è un metodo (almeno in MVC5), quindi non è possibile(). – rumblefx0

Problemi correlati