• 52647
  • 29
  • 13
Нравится блог?
Подписывайтесь!

Глобальные фильтры в ASP.NET MVC 3

Среди множества возможностей в ASP.NET MVC 3, есть и глобальные фильтры действий (actions).

Это значит, что при выполнении какого-либо действия, выполняются все фильтры, которые мы регистрируем в глобальной коллекции (GlobalFilters).

Сразу отмеченная ложка дегтя, всплывает в бочке меда, для всех, кто знает такие механизмы фильтров действий, как FluentFilters или как в OXITE CMS (см. пост "FluentFilters для ASP.NET MVC и OXITE"). Эта ложка — невозможность указать конкретный контроллер и/или действие для которого выполнится фильтр.Это значит, например, что фильтр, который достает из БД различные рекламные баннеры и выдает их с определенной последовательной логикой для отображения на главной странице, будет выполнятся не только на главной странице, но и всех страницах сайта.

Это в принципе хреново, т.к. влияет на производительность. Пусть даже сайт небольшой, фильтров максимум 10-ть, но всё равно это "дело нечисто".

Итак, выход есть, при использовании того же FluentFilters или механизма, как в OXITE CMS (он намного лучше, если читали пост по ссылке выше).

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

 
// рекламное сообщение на главной странице
public class AdActionFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
// проверяем значения из RouteData, если текущий контроллер - "Home" и действие "Index", что
// у нас соответствует главной странице, то выдаем рекламную строку.
// Кстати, здесь, имя действия можно проверять через filterContext.ActionDescriptor.ActionName :)
if ((string)filterContext.RouteData.Values["controller"] == "Home" &&
(string)filterContext.RouteData.Values["action"] == "Index")
{
// ...здесь обращение к БД и пр.
filterContext.Controller.ViewData["Ad"] = "THis is advertising for Homepage!";
}
}
public void OnActionExecuting(ActionExecutingContext filterContext){}
}
 

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

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

 
public class AdActionFilter : FilterAttribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
Expression<Func<HomeController, object>> method =
homeController => homeController.Index();
MethodCallExpression methodCall = method.Body as MethodCallExpression;

ReflectedActionDescriptor actionDescriptor = filterContext.ActionDescriptor as ReflectedActionDescriptor;

if (actionDescriptor.MethodInfo == methodCall.Method)
{
filterContext.Controller.ViewData["Ad"] = "THis is advertising!";
}
}
public void OnActionExecuting(ActionExecutingContext filterContext){}
}
 

Здесь, всё прозрачно для компилятора, поэтому если контроллеры или действия будут переименованы, то он сообщит об этом факте. Но, лично я, недолюбливаю лямбда-выражения в C#, постоянно в них путаюсь, короче, не понимаю, как так можно извращаться над языком программирования.

m-r Tarakanoff tarakanoffth
The best C# and .NET days are ahead of us. (25 Mar 2010 by Miguel de Icaza)
12 июня 2011, 16:28
2037

Загрузка...
Loading...

Комментарии

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

До каких пор чиновники будут игнорировать защиту детей?

До каких пор чиновники будут игнорировать защиту детей?

До каких пор Уполномоченный по правам ребенка, как институт во всем мире стоящий на страже жизни и прав детей, в нашей стране будет выполнять представительские функции?
AliyaSadyrbaeva
25 июля 2017 / 18:27
  • 9505
  • 6
Зачем эмигрировать в Россию? Лично я никогда не понимал этой странной мечты

Зачем эмигрировать в Россию? Лично я никогда не понимал этой странной мечты

Некоторые мои знакомые, мечтают уехать в Россию и побыстрее получить гражданство. Кому мы там сдались? Есть замечательная поговорка: "Где родился - там и пригодился".
Washington
25 июля 2017 / 12:15
Что происходит в казахстанской правоохранительной системе под видом борьбы с коррупцией

Что происходит в казахстанской правоохранительной системе под видом борьбы с коррупцией

За день до своей гибели прямо около памятника жертвам политических репрессий 1937-го Жампозов сказал жене, что он – жертва точно таких же репрессий.
openqazaqstan
24 июля 2017 / 10:18
  • 3272
  • 12
Если вам отвечают на казахском языке – ситуация с точки зрения законодательства

Если вам отвечают на казахском языке – ситуация с точки зрения законодательства

Я своим постом не собираюсь критиковать кого-либо, что люди знают или не знают казахский или русский язык. Я выражаю своё мнение с точки зрения законодательства о языках.
Advokot
25 июля 2017 / 13:50
  • 2611
  • 30
Мужчины Люксембурга и Казахстана: «У нас они уже в 35 добиваются статуса»

Мужчины Люксембурга и Казахстана: «У нас они уже в 35 добиваются статуса»

Что касается парней, так это вообще отдельная тема. Они для меня загадка. Уже год пытаюсь понять ход их мыслей. Для нас, казахов, немного сложно понять, почему человек в 35-36 лет, до сих пор не нашел смысла жизни.
AASh
24 июля 2017 / 15:19
  • 2184
  • 19
Наша новая рубрика «Топ-5»: самые красивые актрисы Казахстана

Наша новая рубрика «Топ-5»: самые красивые актрисы Казахстана

Решили сделать топ-5 красивых актрис Казахстана. Очень долго спорили о первых трех местах и даже чуть не подрались. Было очень тяжело выбирать.
asdbqwe
20 июля 2017 / 14:24
  • 2059
  • 41
Легендарный вокалист «Linkin Park» унёс за собой молодость десятков тысяч людей

Легендарный вокалист «Linkin Park» унёс за собой молодость десятков тысяч людей

Самое грустное, что, как и всегда в таких случаях, скоро на Честера начнут изливаться потоки грязи - что он был наркоманом, или что-то подобное (как в случае со многими знаменитостями).
demonica
21 июля 2017 / 15:13
  • 1972
  • 51
Алматы глазами астанчанки: «У вас жара за 30! Вы не то, что южные – вы Африка!»

Алматы глазами астанчанки: «У вас жара за 30! Вы не то, что южные – вы Африка!»

Все дороги ведут в Алматы. Хотелось бы поспорить, учитывая, как я насмешливо провожала друзей или коллег, которые покидали родную Астанушечку и переезжали «на юг».
SogdiK
21 июля 2017 / 18:25
  • 1817
  • 34
Лечиться нельзя умереть. Страшно, когда запятая поставлена якобы «законом бога»

Лечиться нельзя умереть. Страшно, когда запятая поставлена якобы «законом бога»

Стало известно о смерти четырехлетней Виктории Сусаевой. Отец девочки намерен подать на бывшую супругу в суд, так как уверен, что в смерти дочери виноваты ее религиозные воззрения.
lyalusha
21 июля 2017 / 14:35
  • 1508
  • 16