6

Qualunque cosa sia accaduta alla proprietà Cancel su ActionExecutingContext? Come si abortirebbe una RenderAction quando si utilizza ActionFilterAttribute o esiste un altro modo per skinare questo gatto?ActionFilterAttribute: dov'è la proprietà 'Annulla'?

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    if(!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
    return; 
    } 
    base.OnActionExecuting(filterContext); 
    } 

Il codice precedente continua ad eseguire l'azione che è stato applicato al nonostante uscire l'operazione OnActionExecuting?

--- Ulteriori Per post originale: Grazie per le risposte qui sotto, però, non credo che ho fatto contesto abbastanza chiaro, sto cercando di invalidare la seguente chiamata:

<% Html.RenderAction("Menu", "Shared", new { id = Model.OtherUserId }); %> 

Quando un utente non è autenticato questa azione non dovrebbe restituire nulla, potrei facilmente mettere un blocco "se" sulla vista, tuttavia, vorrei mantenere la regola nel controller.

+0

Vedere il mio aggiornamento sull'azione di rendering. –

risposta

3

No, non è possibile annullare un rendering da un filtro di azioni. Ci sono molte ragioni per cui non dovresti farlo. Cosa vedrebbe il cliente? Una pagina di errore? Niente?

Immagino che tu stia creando un filtro di autorizzazione che renderà qualcos'altro se non sei connesso. Ce n'è già uno nel framework (AuthorizeAttribute) che ti reindirizza alla pagina di login se non sei connesso. il modo in cui lo fanno nel framework è di cambiare il risultato che viene eseguito (filterContext.Result = [[nuovo risultato]];). Se non ti piace come funziona, puoi costruire la tua implementazione.

Se è ancora necessario annullare il rendering o qualcosa del genere, è necessario creare il proprio ActionResult e fare la logica necessaria nel metodo Execute.

- Aggiornamento -

Se si desidera utilizzare il rendering azione si deve solo mettere la logica del controllore e restituire risultati vuoto se non si è effettuato l'accesso (dà un risultato azione denominato "EmptyResult " nella struttura). Questo tipo di logica appartiene all'azione del controller.

14

Questo ha funzionato grande Mattias il risultato è questo:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      filterContext.Result = new EmptyResult(); 
      return; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
+0

ma il codice all'interno del metodo di azione del controller è ancora in esecuzione? – Alex

+0

OnActionExecuting si verifica prima dell'esecuzione del metodo di azione: http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.onactionexecuting(v=vs.118).aspx – rjarmstrong

0

Mattias e rjarmstrong già anwswer domanda. Ecco il codice completo per filtro e controller:

public class CancelFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //before execution 
     var id = filterContext.RequestContext.HttpContext.Request.Params["id"]; 
     if (id == "0") 
     { 
      filterContext.Result = new EmptyResult(); 
      return; 
     } 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     //after execution 
    } 
} 


[CancelFilter] 
public class HomeController : Controller 
{ 
    public ActionResult DoSome(string id) 
    { 
     return View(); 
    } 

    ... 
} 
Problemi correlati