6

Was ist mit der Cancel-Eigenschaft des ActionExecutingContext passiert? Wie würde man eine RenderAction abbrechen, wenn man ein ActionFilterAttribute benutzt oder gibt es eine andere Möglichkeit diese Katze zu skinieren?ActionFilterAttribute: Wo ist die Eigenschaft 'Abbrechen'?

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

Der obige Code setzt die Aktion auszuführen es trotz Verlassen des OnActionExecuting Operation angewendet wurde?

--- weitere zum Original-Beitrag: Danke für die Antworten unten, aber ich glaube nicht, dass ich aus dem Zusammenhang klar genug gemacht habe, versuche ich den folgenden Aufruf zu entkräften:

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

Wenn ein Benutzer nicht authentifiziert wird, sollte diese Aktion nichts zurückgeben, ich könnte leicht einen 'Wenn'-Block in die Ansicht einfügen, aber ich möchte die Regel im Controller behalten.

+0

Siehe mein Update auf Render-Aktion. –

Antwort

3

Nein, Sie können ein Rendering von einem Aktionsfilter nicht abbrechen. Es gibt viele Gründe, warum Sie das nicht tun sollten. Was würde der Klient sehen? Eine Fehlerseite? Nichts?

Ich denke, Sie erstellen einen Autorisierungsaktionsfilter, der etwas anderes rendern würde, wenn Sie nicht angemeldet sind. Es gibt bereits eine im Framework (AuthorizeAttribute), die Sie zur Anmeldeseite weiterleitet, wenn Sie nicht angemeldet sind Die Art und Weise, wie sie es im Rahmen tun, ist, das Ergebnis zu ändern, das gerade ausgeführt wird (filterContext.Result = [[new result]];). Wenn es Ihnen nicht gefällt, wie es funktioniert, können Sie Ihre eigene Implementierung erstellen.

Wenn Sie das Rendering oder etwas ähnliches noch abbrechen müssen, müssen Sie Ihr eigenes ActionResult erstellen und die von Ihnen benötigte Logik in der Execute-Methode ausführen.

- Update -

Wenn Sie Aktion machen verwenden möchten, sollten Sie nur die Logik in der Steuerung setzen und leeres Ergebnis zurück, wenn Sie nicht angemeldet sind (es gibt ein Aktionsergebnis „Emptyresult genannt " im Rahmen). Diese Art von Logik gehört in die Controller-Aktion.

14

Das funktionierte große Mattias das Ergebnis ist folgendes:

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

aber der Code in der Controller-Action-Methode wird noch ausgeführt? – Alex

+0

OnActionExecuting tritt auf, bevor die Aktionsmethode ausgeführt wird: http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.onactionexecuting(v=vs.118).aspx – rjarmstrong

0

Mattias und rjarmstrong bereits anwswer Frage. Hier ist der vollständige Code für Filter und 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(); 
    } 

    ... 
}