Freigeben über


Grundlegendes zu Aktionsfiltern (C#)

von Microsoft

PDF herunterladen

Das Ziel dieses Tutorials besteht darin, Aktionsfilter zu erläutern. Ein Aktionsfilter ist ein Attribut, das Sie auf eine Controlleraktion (oder einen ganzen Controller) anwenden können, der die Art und Weise ändert, in der die Aktion ausgeführt wird.

Grundlegendes zu Aktionsfiltern

Das Ziel dieses Tutorials besteht darin, Aktionsfilter zu erläutern. Ein Aktionsfilter ist ein Attribut, das Sie auf eine Controlleraktion (oder einen ganzen Controller) anwenden können, der die Art und Weise ändert, in der die Aktion ausgeführt wird. Das ASP.NET MVC-Framework enthält mehrere Aktionsfilter:

  • OutputCache: Dieser Aktionsfilter speichert die Ausgabe einer Controlleraktion für einen bestimmten Zeitraum zwischen.
  • HandleError: Dieser Aktionsfilter behandelt Fehler, die beim Ausführen einer Controlleraktion ausgelöst werden.
  • Autorisieren: Mit diesem Aktionsfilter können Sie den Zugriff auf einen bestimmten Benutzer oder eine bestimmte Rolle einschränken.

Sie können auch eigene benutzerdefinierte Aktionsfilter erstellen. Beispielsweise können Sie einen benutzerdefinierten Aktionsfilter erstellen, um ein benutzerdefiniertes Authentifizierungssystem zu implementieren. Alternativ können Sie einen Aktionsfilter erstellen, der die von einer Controlleraktion zurückgegebenen Ansichtsdaten ändert.

In diesem Tutorial erfahren Sie, wie Sie einen Aktionsfilter von Grund auf erstellen. Wir erstellen einen Protokollaktionsfilter, der verschiedene Phasen der Verarbeitung einer Aktion im Ausgabefenster von Visual Studio protokolliert.

Verwenden eines Aktionsfilters

Ein Aktionsfilter ist ein Attribut. Sie können die meisten Aktionsfilter entweder auf eine einzelne Controlleraktion oder einen ganzen Controller anwenden.

Beispielsweise macht der Datencontroller in Listing 1 eine Aktion mit dem Namen Index() verfügbar, die die aktuelle Uhrzeit zurückgibt. Diese Aktion wird mit dem OutputCache Aktionsfilter ergänzt. Dieser Filter bewirkt, dass der von der Aktion zurückgegebene Wert 10 Sekunden lang zwischengespeichert wird.

Eintrag 1 – Controllers\DataController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
     public class DataController : Controller
     {
          [OutputCache(Duration=10)]
          public string Index()
          {
               return DateTime.Now.ToString("T");
          }
     }
}

Wenn Sie die Index() Aktion wiederholt aufrufen, indem Sie die URL /Data/Index in die Adressleiste Ihres Browsers eingeben und mehrmals auf die Schaltfläche Aktualisieren klicken, wird die gleiche Zeit für 10 Sekunden angezeigt. Die Ausgabe der Index() Aktion wird 10 Sekunden lang zwischengespeichert (siehe Abbildung 1).

Zwischengespeicherte Zeit

Abbildung 01: Zwischengespeicherte Zeit (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

In Listing 1 wird ein einzelner Aktionsfilter – der OutputCache Aktionsfilter – auf die Index() -Methode angewendet. Bei Bedarf können Sie mehrere Aktionsfilter auf dieselbe Aktion anwenden. Beispielsweise können Sie sowohl den Aktionsfilter als HandleError auch den OutputCache Aktionsfilter auf dieselbe Aktion anwenden.

In Listing 1 wird der OutputCache Aktionsfilter auf die Index() Aktion angewendet. Sie können dieses Attribut auch auf die DataController Klasse selbst anwenden. In diesem Fall wird das Ergebnis, das von einer aktion zurückgegeben wird, die vom Controller verfügbar gemacht wird, 10 Sekunden lang zwischengespeichert.

Die verschiedenen Filtertypen

Das ASP.NET MVC-Framework unterstützt vier verschiedene Filtertypen:

  1. Autorisierungsfilter: Implementiert das IAuthorizationFilter Attribut.
  2. Aktionsfilter: Implementiert das IActionFilter Attribut.
  3. Ergebnisfilter: Implementiert das IResultFilter Attribut.
  4. Ausnahmefilter: Implementiert das IExceptionFilter -Attribut.

Filter werden in der oben aufgeführten Reihenfolge ausgeführt. Beispielsweise werden Autorisierungsfilter immer ausgeführt, bevor Aktions- und Ausnahmefilter immer nach jedem anderen Filtertyp ausgeführt werden.

Autorisierungsfilter werden verwendet, um die Authentifizierung und Autorisierung für Controlleraktionen zu implementieren. Der Autorisierungsfilter ist beispielsweise ein Beispiel für einen Autorisierungsfilter.

Aktionsfilter enthalten Logik, die vor und nach der Ausführung einer Controlleraktion ausgeführt wird. Sie können einen Aktionsfilter für instance verwenden, um die Von einer Controlleraktion zurückgegebenen Ansichtsdaten zu ändern.

Ergebnisfilter enthalten Logik, die vor und nach der Ausführung eines Ansichtsergebnisses ausgeführt wird. Beispielsweise können Sie ein Ansichtsergebnis direkt ändern, bevor die Ansicht im Browser gerendert wird.

Ausnahmefilter sind der letzte Typ von Filter, der ausgeführt werden soll. Sie können einen Ausnahmefilter verwenden, um Fehler zu behandeln, die entweder von Ihren Controlleraktionen oder controlleraktionsergebnissen ausgelöst werden. Sie können auch Ausnahmefilter verwenden, um Fehler zu protokollieren.

Jeder andere Filtertyp wird in einer bestimmten Reihenfolge ausgeführt. Wenn Sie die Reihenfolge steuern möchten, in der Filter desselben Typs ausgeführt werden, können Sie die Order-Eigenschaft eines Filters festlegen.

Die Basisklasse für alle Aktionsfilter ist die System.Web.Mvc.FilterAttribute -Klasse. Wenn Sie einen bestimmten Filtertyp implementieren möchten, müssen Sie eine Klasse erstellen, die von der Filter-Basisklasse erbt und mindestens eine der IAuthorizationFilterSchnittstellen , IActionFilter, IResultFilteroder IExceptionFilter implementiert.

Die Base ActionFilterAttribute-Klasse

Um die Implementierung eines benutzerdefinierten Aktionsfilters zu vereinfachen, enthält das ASP.NET MVC-Frameworks eine Basisklasse ActionFilterAttribute . Diese Klasse implementiert sowohl die -Schnittstelle als IResultFilter auch die IActionFilter -Schnittstelle und erbt von der Filter -Klasse.

Die Terminologie hier ist nicht vollständig konsistent. Technisch gesehen ist eine Klasse, die von der ActionFilterAttribute-Klasse erbt, sowohl ein Aktionsfilter als auch ein Ergebnisfilter. Im losen Sinne wird der Wortaktionsfilter jedoch verwendet, um auf jeden Filtertyp im ASP.NET MVC-Framework zu verweisen.

Die Basisklasse ActionFilterAttribute verfügt über die folgenden Methoden, die Sie überschreiben können:

  • OnActionExecuting: Diese Methode wird aufgerufen, bevor eine Controlleraktion ausgeführt wird.
  • OnActionExecuted: Diese Methode wird aufgerufen, nachdem eine Controlleraktion ausgeführt wurde.
  • OnResultExecuting: Diese Methode wird aufgerufen, bevor ein Controlleraktionsergebnis ausgeführt wird.
  • OnResultExecuted: Diese Methode wird aufgerufen, nachdem ein Controlleraktionsergebnis ausgeführt wurde.

Im nächsten Abschnitt erfahren Sie, wie Sie jede dieser verschiedenen Methoden implementieren können.

Erstellen eines Protokollaktionsfilters

Um zu veranschaulichen, wie Sie einen benutzerdefinierten Aktionsfilter erstellen können, erstellen wir einen benutzerdefinierten Aktionsfilter, der die Phasen der Verarbeitung einer Controlleraktion im Ausgabefenster von Visual Studio protokolliert. Unsere LogActionFilter ist in Listing 2 enthalten.

Eintrag 2 – ActionFilters\LogActionFilter.cs

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.ActionFilters
{
     public class LogActionFilter : ActionFilterAttribute

     {
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
               Log("OnActionExecuting", filterContext.RouteData);       
          }

          public override void OnActionExecuted(ActionExecutedContext filterContext)
          {
               Log("OnActionExecuted", filterContext.RouteData);       
          }

          public override void OnResultExecuting(ResultExecutingContext filterContext)
          {
               Log("OnResultExecuting", filterContext.RouteData);       
          }

          public override void OnResultExecuted(ResultExecutedContext filterContext)
          {
               Log("OnResultExecuted", filterContext.RouteData);       
          }


          private void Log(string methodName, RouteData routeData)
          {
               var controllerName = routeData.Values["controller"];
               var actionName = routeData.Values["action"];
               var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
               Debug.WriteLine(message, "Action Filter Log");
          }

     }
}

In Listing 2 rufen die OnActionExecuting()Methoden , OnActionExecuted(), OnResultExecuting()und OnResultExecuted() alle die Log() -Methode auf. Der Name der Methode und die aktuellen Routendaten werden an die Log() -Methode übergeben. Die Log() -Methode schreibt eine Nachricht in das Visual Studio-Ausgabefenster (siehe Abbildung 2).

Schreiben in das Visual Studio-Ausgabefenster

Abbildung 02: Schreiben in das Visual Studio-Ausgabefenster (Klicken Sie hier, um das Bild in voller Größe anzuzeigen)

Der Home-Controller in Listing 3 veranschaulicht, wie Sie den Protokollaktionsfilter auf eine gesamte Controllerklasse anwenden können. Immer wenn eine der Aktionen aufgerufen wird, die vom Home-Controller verfügbar gemacht werden – entweder die Index() -Methode oder die About() -Methode –, werden die Phasen der Verarbeitung der Aktion im Visual Studio-Ausgabefenster protokolliert.

Eintrag 3 – Controllers\HomeController.cs

using System.Web.Mvc;
using MvcApplication1.ActionFilters;

namespace MvcApplication1.Controllers
{
     [LogActionFilter]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }

          public ActionResult About()
          {
               return View();
          }
     }
}

Zusammenfassung

In diesem Tutorial wurden Sie mit ASP.NET MVC-Aktionsfiltern eingeführt. Sie haben die vier verschiedenen Filtertypen kennengelernt: Autorisierungsfilter, Aktionsfilter, Ergebnisfilter und Ausnahmefilter. Außerdem haben Sie mehr über die Basisklasse ActionFilterAttribute erfahren.

Schließlich haben Sie gelernt, wie Sie einen einfachen Aktionsfilter implementieren. Wir haben einen Protokollaktionsfilter erstellt, der die Phasen der Verarbeitung einer Controlleraktion im Visual Studio-Ausgabefenster protokolliert.