Поделиться через


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

от Майкрософт

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

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

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

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

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

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

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

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

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

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

Листинг 1 — Controllers\DataController.vb

Public Class DataController
     Inherits System.Web.Mvc.Controller

     <OutputCache(Duration:=10)> _
     Function Index()
          Return DateTime.Now.ToString("T")

     End Function

End Class

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

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

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

В листинге 1 к методу OutputCache применяется Index() один фильтр действий — фильтр действий. При необходимости можно применить несколько фильтров действий к одному действию. Например, может потребоваться применить 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 или ExceptionFilter.

Класс 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.vb

Public Class LogActionFilter
     Inherits ActionFilterAttribute

     Public Overrides Sub OnActionExecuting(ByVal filterContext As ActionExecutingContext)
          Log("OnActionExecuting", filterContext.RouteData)

     End Sub

     Public Overrides Sub OnActionExecuted(ByVal filterContext As ActionExecutedContext)
          Log("OnActionExecuted", filterContext.RouteData)
     End Sub

     Public Overrides Sub OnResultExecuting(ByVal filterContext As ResultExecutingContext)
          Log("OnResultExecuting", filterContext.RouteData)
     End Sub

     Public Overrides Sub OnResultExecuted(ByVal filterContext As ResultExecutedContext)
          Log("OnResultExecuted", filterContext.RouteData)
     End Sub

     Private Sub Log(ByVal methodName As String, ByVal routeData As RouteData)
          Dim controllerName = routeData.Values("controller")
          Dim actionName = routeData.Values("action")
          Dim message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName)
          Debug.WriteLine(message, "Action Filter Log")
     End Sub

End Class

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

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

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

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

Листинг 3. Controllers\HomeController.vb

<LogActionFilter()> _
Public Class HomeController
     Inherits System.Web.Mvc.Controller

     Function Index()
          Return View()
     End Function

     Function About()
          Return View()
     End Function

            End Class

Итоги

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

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