7 Stimmen

ActionFilterAttribut: Wo ist die Eigenschaft "Abbrechen"?

Was ist aus der Eigenschaft Cancel des ActionExecutingContext geworden? Wie würde man eine RenderAction abbrechen, wenn man ein ActionFilterAttribute verwendet, oder gibt es einen anderen Weg, diese Katze zu häuten?

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

Der obige Code führt die Aktion, auf die er angewendet wurde, trotz Beendigung des Vorgangs OnActionExecuting?

--- Weiter zum ursprünglichen Beitrag: Vielen Dank für die Antworten, aber ich glaube, ich habe den Zusammenhang nicht deutlich genug gemacht, ich versuche, den folgenden Aufruf zu entkräften:

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

Wenn ein Benutzer nicht authentifiziert ist, sollte diese Aktion nichts zurückgeben, ich könnte leicht einen "if"-Block auf die Ansicht setzen, jedoch möchte ich die Regel in der Steuerung zu halten.

14voto

rjarmstrong Punkte 1221

Das hat super funktioniert, 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);
    }

3voto

Mattias Jakobsson Punkte 8158

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

Ich vermute, dass Sie einen Authorize-Action-Filter bauen, der etwas anderes darstellen würde, wenn Sie nicht angemeldet sind. Es gibt bereits einen im Framework (AuthorizeAttribute), der Sie auf die Anmeldeseite umleitet, wenn Sie nicht angemeldet sind. Die Methode, die im Framework verwendet wird, besteht darin, das ausgeführte Ergebnis zu ändern (filterContext.Result = [[new result]];). Wenn Ihnen das nicht gefällt, können Sie Ihre eigene Implementierung erstellen.

Wenn Sie das Rendering noch abbrechen müssen, müssen Sie ein eigenes ActionResult erstellen und in der Execute-Methode die erforderliche Logik ausführen.

-- Aktualisierung --

Wenn Sie eine Rendering-Aktion verwenden möchten, sollten Sie die Logik einfach in den Controller einbauen und ein leeres Ergebnis zurückgeben, wenn Sie nicht angemeldet sind (im Framework gibt es ein Aktionsergebnis namens "EmptyResult"). Diese Art von Logik gehört in die Controller-Aktion.

0voto

Alexey Obukhov Punkte 766

Mattias und rjarmstrong haben die Frage bereits beantwortet. 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();
    }

    ...
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X