Общие сведения о фильтрах действий (C#)

от Корпорации Майкрософт

Загрузить PDF-файл

Цель этого руководства — объяснить фильтры действий. Фильтр действий — это атрибут, который можно применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия.

Основные сведения о фильтрах действий

Цель этого руководства — объяснить фильтры действий. Фильтр действий — это атрибут, который можно применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия. Платформа MVC ASP.NET включает несколько фильтров действий:

  • OutputCache — этот фильтр действий кэширует выходные данные действия контроллера в течение указанного периода времени.
  • HandleError — этот фильтр действий обрабатывает ошибки, возникающие при выполнении действия контроллера.
  • Авторизовать — этот фильтр действий позволяет ограничить доступ к определенному пользователю или роли.

Вы также можете создать собственные настраиваемые фильтры действий. Например, может потребоваться создать настраиваемый фильтр действий, чтобы реализовать пользовательскую систему проверки подлинности. Кроме того, может потребоваться создать фильтр действий, который изменяет данные представления, возвращаемые действием контроллера.

В этом руководстве вы узнаете, как создать фильтр действий с нуля. Мы создаем фильтр действий журнала, который регистрирует различные этапы обработки действия в окне вывода Visual Studio.

Использование фильтра действий

Фильтр действий является атрибутом. Большинство фильтров действий можно применить либо к отдельному действию контроллера, либо ко всему контроллеру.

Например, контроллер данных в листинге 1 предоставляет действие с именем Index() , которое возвращает текущее время. Это действие дополнено фильтром OutputCache действий. Этот фильтр приводит к кэшированию значения, возвращаемого действием, в течение 10 секунд.

Листинг 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");
          }
     }
}

Если вы несколько раз вызываете Index() действие, вводя URL-адрес /Data/Index в адресной строке браузера и нажимая кнопку Обновить несколько раз, вы увидите то же время в течение 10 секунд. Выходные Index() данные действия кэшируются в течение 10 секунд (см. рис. 1).

Кэшированное время

Рис. 01. Кэшированное время (щелкните для просмотра полноразмерного изображения)

В листинге 1 к методу OutputCacheIndex() применяется один фильтр действий — фильтр действий. При необходимости можно применить несколько фильтров действий к одному действию. Например, может потребоваться применить OutputCache фильтры действий и HandleError к одному и тому же действию.

В листинге OutputCache 1 к действию применяется Index() фильтр действий. Этот атрибут также можно применить к самому классу DataController . В этом случае результат, возвращаемый любым действием, предоставляемым контроллером, будет кэшироваться в течение 10 секунд.

Различные типы фильтров

Платформа MVC ASP.NET поддерживает четыре различных типа фильтров:

  1. Фильтры авторизации — реализует IAuthorizationFilter атрибут .
  2. Фильтры действий — реализует IActionFilter атрибут .
  3. Фильтры результатов — реализует IResultFilter атрибут .
  4. Фильтры исключений — реализует IExceptionFilter атрибут .

Фильтры выполняются в указанном выше порядке. Например, фильтры авторизации всегда выполняются перед фильтрами действий и фильтрами исключений после каждого другого типа фильтра.

Фильтры авторизации используются для реализации проверки подлинности и авторизации для действий контроллера. Например, фильтр "Авторизация" является примером фильтра авторизации.

Фильтры действий содержат логику, которая выполняется до и после выполнения действия контроллера. Например, можно использовать фильтр действий для изменения данных представления, возвращаемого действием контроллера.

Фильтры результатов содержат логику, которая выполняется до и после выполнения результата представления. Например, может потребоваться изменить результат представления непосредственно перед отображением представления в браузере.

Фильтры исключений — это последний тип фильтра для запуска. Фильтр исключений можно использовать для обработки ошибок, вызванных действиями контроллера или результатами действий контроллера. Вы также можете использовать фильтры исключений для регистрации ошибок.

Каждый тип фильтра выполняется в определенном порядке. Если вы хотите управлять порядком, в котором выполняются фильтры одного типа, можно задать свойство order фильтра.

Базовым классом для всех фильтров действий является System.Web.Mvc.FilterAttribute класс . Если вы хотите реализовать определенный тип фильтра, необходимо создать класс, который наследует от базового класса Filter и реализует один или IAuthorizationFilterнесколько интерфейсов , IActionFilter, , IResultFilterили IExceptionFilter .

Класс Base ActionFilterAttribute

Чтобы упростить реализацию настраиваемого фильтра действий, платформа MVC ASP.NET включает базовый ActionFilterAttribute класс. Этот класс реализует интерфейсы IActionFilter и и IResultFilter наследует от Filter класса .

Терминология здесь не совсем согласована. Технически класс, наследующий от класса ActionFilterAttribute, является одновременно фильтром действий и фильтром результатов. Однако в свободном смысле слово фильтр действий используется для обозначения любого типа фильтра в ASP.NET платформе MVC.

Базовый ActionFilterAttribute класс имеет следующие методы, которые можно переопределить:

  • OnActionExecuting — этот метод вызывается перед выполнением действия контроллера.
  • OnActionExecuted — этот метод вызывается после выполнения действия контроллера.
  • OnResultExecuting — этот метод вызывается перед выполнением результата действия контроллера.
  • OnResultExecuted — этот метод вызывается после выполнения результата действия контроллера.

В следующем разделе мы рассмотрим, как реализовать каждый из этих методов.

Создание фильтра действий журнала

Чтобы проиллюстрировать создание настраиваемого фильтра действий, мы создадим настраиваемый фильтр действий, который регистрирует этапы обработки действия контроллера в окне Вывода Visual Studio. Наш LogActionFilter содержится в листинге 2.

Листинг 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");
          }

     }
}

В листинге OnActionExecuting()2 методы , OnActionExecuted(), OnResultExecuting()и OnResultExecuted() вызывают Log() метод . В метод передаются имя метода и данные текущего Log() маршрута. Метод Log() записывает сообщение в окно Вывода Visual Studio (см. рис. 2).

Запись в окно вывода Visual Studio

Рис. 02. Запись в окно вывода Visual Studio (щелкните для просмотра полноразмерного изображения)

Контроллер Home в листинге 3 показывает, как можно применить фильтр действий log ко всему классу контроллера. Всякий раз, когда вызывается какое-либо действие, предоставляемое контроллером Home ( метод Index() или About() метод ), этапы обработки действия регистрируются в окне Вывода Visual Studio.

Листинг 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();
          }
     }
}

Итоги

В этом руководстве вы познакомились с ASP.NET фильтрами действий MVC. Вы узнали о четырех различных типах фильтров: фильтрах авторизации, фильтрах действий, фильтрах результатов и фильтрах исключений. Вы также узнали о базовом ActionFilterAttribute классе.

Наконец, вы узнали, как реализовать простой фильтр действий. Мы создали фильтр действий журнала, который регистрирует этапы обработки действия контроллера в окне Вывода Visual Studio.