6

¿Qué pasó con la propiedad Cancel en el ActionExecutingContext? ¿Cómo se podría abortar un RenderAction cuando se utiliza un ActionFilterAttribute o hay otra forma de piel de este gato?ActionFilterAttribute: ¿Dónde está la propiedad 'Cancelar'?

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

El código anterior sigue para ejecutar la acción que se ha aplicado a pesar de la salida de la operación OnActionExecuting?

--- adicional a la publicación original: Gracias por las respuestas a continuación, sin embargo, no creo que he hecho el contexto lo suficientemente claro, estoy tratando de invalidar la siguiente llamada:

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

Cuando un usuario no está autenticado, esta acción no devuelve nada, podría poner fácilmente un bloque 'if' en la vista, sin embargo, me gustaría mantener la regla en el controlador.

+0

Ver mi actualización sobre la inutilidad la actuación. –

Respuesta

3

No, no se puede cancelar una representación de un filtro de acción. Hay muchas razones por las que no deberías hacer eso. ¿Qué vería el cliente? Una página de error? ¿Nada?

Supongo que está creando un filtro de acción autorizar que representaría algo más si no ha iniciado sesión. Ya hay uno en el marco (AuthorizeAttribute) que lo redirecciona a la página de inicio de sesión si no ha iniciado sesión. manera que lo hacen en el marco es cambiar el resultado de que está siendo ejecutado (filterContext.Result = [[nuevo resultado]];). Si no te gusta cómo funciona, puedes construir tu propia implementación.

Si todavía necesita cancelar la prestación o algo así que tendrá que construir su propia ActionResult y hacer lo que la lógica que necesita en el método Execute.

- Actualización -

Si desea utilizar la inutilidad la actuación sólo debe poner la lógica en el controlador y volver resultados vacío si no ha iniciado sesión (hay un resultado de la acción denominada "EmptyResult "en el marco). Ese tipo de lógica pertenece a la acción del controlador.

14

Esto funcionó de maravilla Mattias el resultado es este:

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

pero el código dentro del método de acción del controlador todavía se está ejecutando? – Alex

+0

OnActionExecuting se produce antes de que se ejecute el método de acción: http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.onactionexecuting(v=vs.118).aspx – rjarmstrong

0

Mattias y rjarmstrong ya anwswer cuestión. Aquí está el código completo para filtro y regulador:

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

    ... 
} 
Cuestiones relacionadas