Domanda

Che fine ha fatto la proprietà Cancel sul ActionExecutingContext? Come si potrebbe interrompere una RenderAction quando si utilizza un ActionFilterAttribute O c'è un altro modo per scuoiare questo gatto?

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

Il codice di cui sopra continua a eseguire l'azione che è stata applicata al nonostante uscire l'operazione OnActionExecuting?

--- Ulteriori Per post originale: Grazie per le risposte di seguito, tuttavia, 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 deve restituire nulla, ho potuto facilmente mettere un 'se' blocco sulla vista, però, vorrei mantenere la regola nel controller.

È stato utile?

Soluzione

No, non è possibile annullare un rendering da un filtro azione. Ci sono molte ragioni per cui non si deve fare questo. Quale sarebbe il cliente vedere? Una pagina di errore? Niente?

Credo che si sta costruendo un filtro azione autorizzare che renderebbe qualcosa d'altro se non si è effettuato l'accesso. C'è una nel quadro già (AuthorizeAttribute) che reindirizza alla pagina di login, se non si è effettuato l'accesso. Il modo in cui che lo fanno nel quadro è quello di cambiare il risultato che è in esecuzione (filterContext.Result = [[nuovo risultato]];). Se non ti piace come funziona si può costruire una propria implementazione.

Se hai ancora bisogno di cancellare il rendering o qualcosa del genere è necessario costruire il proprio ActionResult e fare tutto ciò che la logica è necessario 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" nel quadro). Questo tipo di logica appartiene l'azione del regolatore.

Altri suggerimenti

Questo ha funzionato grandi Mattias il risultato è questo:

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

Mattias e rjarmstrong già anwswer domanda. Qui è pieno di codice per il filtro e di controllo:

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

    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top