Общие сведения о фильтрах действий (VB)
от Майкрософт
Цель этого руководства — объяснить фильтры действий. Фильтр действий — это атрибут, который можно применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия.
Основные сведения о фильтрах действий
Цель этого руководства — объяснить фильтры действий. Фильтр действий — это атрибут, который можно применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия. Платформа 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 поддерживает четыре различных типа фильтров:
- Фильтры авторизации — реализует
IAuthorizationFilter
атрибут . - Фильтры действий — реализует
IActionFilter
атрибут . - Фильтры результатов — реализует
IResultFilter
атрибут . - Фильтры исключений
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).
Рис. 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.