В ASP.NET MVC контроллеры определяют методы действия, которые обычно имеют взаимно-однозначное отношение с возможными взаимодействиями с пользователем, но иногда требуется выполнить логику либо до вызова метода действия, либо после запуска метода действия.
Для поддержки этого ASP.NET MVC предоставляет фильтры. Фильтры — это пользовательские классы, которые предоставляют как декларативные, так и программные средства для добавления поведения до и после действия в методы действия контроллера.
Фильтры действий
Фильтр действия — это атрибут, который вы можете применить к действию контроллера или ко всему контроллеру, который изменяет способ выполнения действия. ASP.NET MVC Framework включает в себя несколько фильтров действий —
-
OutputCache — кэширует выходные данные действия контроллера в течение указанного промежутка времени.
-
HandleError — Обрабатывает ошибки, возникающие при выполнении действия контроллера.
-
Авторизация — позволяет вам ограничить доступ к определенному пользователю или роли.
OutputCache — кэширует выходные данные действия контроллера в течение указанного промежутка времени.
HandleError — Обрабатывает ошибки, возникающие при выполнении действия контроллера.
Авторизация — позволяет вам ограничить доступ к определенному пользователю или роли.
Типы фильтров
Платформа ASP.NET MVC поддерживает четыре различных типа фильтров:
-
Фильтры авторизации — реализует атрибут IAuthorizationFilter.
-
Фильтры действий — реализует атрибут IActionFilter.
-
Фильтры результатов — реализует атрибут IResultFilter.
-
Фильтры исключений — реализует атрибут IExceptionFilter.
Фильтры авторизации — реализует атрибут IAuthorizationFilter.
Фильтры действий — реализует атрибут IActionFilter.
Фильтры результатов — реализует атрибут IResultFilter.
Фильтры исключений — реализует атрибут IExceptionFilter.
Фильтры выполняются в порядке, указанном выше. Например, фильтры авторизации всегда выполняются до фильтров действий, а фильтры исключений всегда выполняются после каждого другого типа фильтра.
Фильтры авторизации используются для реализации аутентификации и авторизации для действий контроллера. Например, фильтр авторизации является примером фильтра авторизации.
Давайте рассмотрим простой пример, создав новый проект ASP.Net MVC.
Шаг 1 — Откройте Visual Studio и выберите «Файл» → «Создать» → пункт меню «Проект».
Откроется новое диалоговое окно проекта.
Шаг 2 — На левой панели выберите Шаблоны → Visual C # → Интернет.
Шаг 3 — В средней панели выберите Веб-приложение ASP.NET.
Шаг 4. Введите имя проекта MVCFiltersDemo в поле «Имя» и нажмите «ОК», чтобы продолжить, и вы увидите следующее диалоговое окно, в котором вас попросят установить начальное содержимое для проекта ASP.NET.
Шаг 5. Чтобы упростить задачу, выберите опцию «Очистить» и установите флажок MVC в разделе «Добавить папки и основные ссылки для» и нажмите кнопку «ОК».
Это создаст базовый проект MVC с минимальным предопределенным содержанием.
Шаг 6. Чтобы добавить контроллер, щелкните правой кнопкой мыши папку контроллера в обозревателе решений и выберите «Добавить» → «Контроллер».
Появится диалоговое окно Add Scaffold.
Шаг 7 — Выберите MVC 5 Controller — Empty option и нажмите кнопку «Добавить».
Откроется диалоговое окно Add Controller.
Шаг 8 — Установите имя HomeController и нажмите кнопку «Добавить».
Вы увидите новый C # -файл «HomeController.cs» в папке «Контроллеры», который также открыт для редактирования в Visual Studio.
Применить фильтр действий
Фильтр действий может применяться либо к отдельному действию контроллера, либо ко всему контроллеру. Например, фильтр действия OutputCache применяется к действию с именем Index (), которое возвращает строку. Этот фильтр вызывает кэширование значения, возвращаемого действием, в течение 15 секунд.
Чтобы сделать это рабочим примером, давайте изменим класс контроллера, изменив метод действия с именем Index, используя следующий код.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCFiltersDemo.Controllers { public class HomeController : Controller{ // GET: Home [OutputCache(Duration = 15)] public string Index(){ return "This is ASP.Net MVC Filters Tutorial"; } } }
Когда вы запустите это приложение, вы увидите, что браузер отображает результат метода действия Index.
Давайте добавим еще один метод действия, который будет отображать текущее время.
namespace MVCFiltersDemo.Controllers{ public class HomeController : Controller{ // GET: Home [OutputCache(Duration = 15)] public string Index(){ return "This is ASP.Net MVC Filters Tutorial"; } [OutputCache(Duration = 20)] public string GetCurrentTime(){ return DateTime.Now.ToString("T"); } } }
Запросите следующий URL, http: // localhost: 62833 / Home / GetCurrentTime , и вы получите следующий вывод.
Если вы обновите браузер, вы увидите то же самое время, потому что действие кэшируется на 20 секунд. Он будет обновлен, когда вы обновите его через 20 секунд.
Пользовательские фильтры
Для создания собственного настраиваемого фильтра платформа ASP.NET MVC предоставляет базовый класс, который называется ActionFilterAttribute. Этот класс реализует интерфейсы IActionFilter и IResultFilter, и оба они являются производными от класса Filter.
Давайте рассмотрим простой пример пользовательского фильтра, создав новую папку в вашем проекте с помощью ActionFilters. Добавьте один класс, для которого щелкните правой кнопкой мыши папку ActionFilters и выберите «Добавить» → «Класс».
Введите «MyLogActionFilter» в поле имени и нажмите кнопку «Добавить».
Этот класс будет производным от ActionFilterAttribute , который является базовым классом и переопределяет следующий метод. Ниже приводится полная реализация MyLogActionFilter.
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MVCFiltersDemo.ActionFilters { public class MyLogActionFilter : 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"); } } }
Давайте теперь применим фильтр журнала к HomeController, используя следующий код.
using MVCFiltersDemo.ActionFilters; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCFiltersDemo.Controllers { [MyLogActionFilter] public class HomeController : Controller{ // GET: Home [OutputCache(Duration = 10)] public string Index(){ return "This is ASP.Net MVC Filters Tutorial"; } [OutputCache(Duration = 10)] public string GetCurrentTime(){ return DateTime.Now.ToString("T"); } } }
Запустите приложение и затем посмотрите окно вывода.
Как видно на скриншоте выше, этапы обработки действия записываются в окно вывода Visual Studio.