6

Cokolwiek stało się z właściwością Anuluj w ActionExecutingContext? Jak można przerwać RenderAction przy użyciu ActionFilterAttribute lub czy istnieje inny sposób na skórki tego kota?ActionFilterAttribute: Gdzie jest właściwość "Anuluj"?

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

Powyższy kod nadal wykonuje działanie, do którego został zastosowany pomimo zakończenia operacji OnActionExecuting?

--- dalej do oryginalnego postu: Dzięki za odpowiedzi poniżej, jednak nie sądzę, zrobiłem wystarczająco jasno z kontekstu, staram się unieważnić następujące połączenia:

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

Gdy użytkownik nie jest uwierzytelniony, ta akcja nie powinna niczego zwracać, mógłbym łatwo umieścić blok "if" w widoku, jednak chciałbym zachować regułę w kontrolerze.

+0

Zobacz moją aktualizację akcji renderowania. –

Odpowiedz

3

Nie, nie można anulować renderowania z filtra akcji. Jest wiele powodów, dla których nie powinieneś tego robić. Co zobaczyłby klient? Strona błędu? Nic?

Podejrzewam, że budujesz autoryzowany filtr działań, który renderowałby coś innego, jeśli nie jesteś zalogowany. Jest już jeden w strukturze (AuthorizeAttribute), który przekierowuje cię do strony logowania, jeśli nie jesteś zalogowany. sposób, w jaki robią to w ramach, jest zmiana wyniku, który jest wykonywany (filterContext.Result = [[nowy wynik]];). Jeśli nie podoba ci się, jak to działa, możesz zbudować własną implementację.

Jeśli nadal musisz anulować renderowanie lub coś w tym stylu, musisz zbudować własne ActionResult i wykonać dowolną logikę, którą potrzebujesz w metodzie Execute.

- Update -

Jeśli chcesz użyć renderowanie działania należy po prostu umieścić logikę w sterowniku i powrócić pusty wynik, jeśli nie jesteś zalogowany (jest to wynik działania o nazwie „EmptyResult "w ramach). Ten rodzaj logiki należy do akcji kontrolera.

14

Ten działał świetnie Mattias wynik to:

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

, ale kod metody działania kontrolera jest nadal wykonywany? – Alex

+0

Wykonanie polecenia OnActionExecuting następuje przed wykonaniem metody działania: http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.onactionexecuting(v=vs.118).aspx – rjarmstrong

0

Mattias i rjarmstrong już anwswer pytanie. Oto pełny kod filtra i kontrolera:

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

    ... 
}