2015-08-17 6 views
6

В соответствии с этим documentation for ASP.NET Filters фильтров выполняются в следующем порядке:Что такое область фильтра и почему странные имена?

  1. Авторизационные фильтры
  2. Действие фильтры
  3. фильтры отклика
  4. Исключительные фильтры

Внутри- каждого типа фильтра имеется filter Заказ, который определяет порядок выполнения.

Имеет смысл до сих пор ... но тогда это становится странным.

Существует еще способ заказа в пределах каждого типа фильтра и порядка, который представлен в виде перечисления из следующих значений:

public enum FilterScope 
{ 
    First = 0, 
    Global = 10, 
    Controller = 20, 
    Action = 30, 
    Last = 100, 
} 

Какое это Global, контроллер и действие должны в порядке выполнения для фильтра действий?

Например:

Если у меня есть два Action Filters, как с заказом выполнения 1 и FilterScope от контроллера и действия соответственно.

Другие, чем заказать один перед другим, какой подшипник Controller и Action есть на что угодно?

Далее странности

According to thisFilterScope предусматривает упорядочение третьего уровня для фильтров. Как Controller, Global или Action заказ на фильтр, который никоим образом не ограничен для использования только на Controller, Action и необязательно применяется в глобальном масштабе? Он не описывает порядок.

Кроме того, если он обеспечивает фильтрацию на третьем уровне, почему он ограничен только 5 вариантами?

+0

Я думаю, что 'FilterScope' определяет, где вы используете фильтр: глобально, на всем контроллере или на каком-либо действии. Итак, первый, который будет выполняться, будет глобальным фильтром, затем контроллером, а затем действием –

+0

Помогает ли вам это: https://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v= vs.118) .aspx? – Marco

+0

@VsevolodGoloviznin Я думал то же самое, но это не объясняет, почему он указан для каждого типа и порядка фильтрации, он, несомненно, будет их всеобъемлющим. Таким образом, это будет: Область фильтра, Тип фильтра, Заказ фильтра. А не наоборот? – Luke

ответ

3

Filter объекты, объекты, которые на самом деле имеют Scope собственности, строятся на основе использования - при добавлении фильтра к глобальному применению фильтры, объект Filter построен с использованием Scope от Global. Аналогично, когда атрибуты фильтра собираются из контроллера и действия, объекты Filter строятся с использованием областей Controller и Action соответственно.

Я не совсем уверен, как Filter с Scope из First или Last фактически получает создан.

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

+1

Я думаю, что по умолчанию это 'First', поскольку он является первым в' enum', что приводит к равенству '0' – VMAtm

2

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

авторизация, действий, ответы и исключения фильтры 4 интерфейса можно реализовать, чтобы запустить логику фильтра, IAuthorizationFilter, IActionFilter, IResultFilter и IExceptionFilter интерфейсов соответственно.

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

  • Если пользователь не завершил регистрацию, вы должны напомнить ему об этом. Это правило должно быть запущено на уровне First, независимо от того, что пользователь делает на вашем сайте.
  • Если пользователь не был одобрен, он не может просматривать содержимое сайта и должен получить подтверждение.Таким образом, это правило Global, и оно должно быть запущено до любых других проверок прав пользователей.
  • Если у пользователя нет доступа для какого-либо отдела, он не может просматривать какой-либо контент на сайте относительно этого отдела, но не все - поэтому мы разрешаем Controller выбрать, что должно отображаться пользователю.
  • Если пользователь не является менеджером, он не может редактировать или удалять контент. Итак, это конкретный Action, который фильтруется.
  • Мы можем запустить некоторый регистратор после обработки задачи, поэтому нам нужно подождать, пока работа не будет выполнена, и запустите фильтр по адресу Last.

Я вижу здесь очень простая модель для фильтра упорядочения, и я могу предоставить образец для каждой пары или filter type/filter scope.

Update:

some sample code for a Filter's ordering:

public class ControllerInstanceFilterProvider : IFilterProvider { 
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { 
     if (controllerContext.Controller != null) { 
      // Use FilterScope.First and Order of Int32.MinValue to ensure controller instance methods always run first 
      yield return new Filter(controllerContext.Controller, FilterScope.First, Int32.MinValue); 
     } 
    } 
} 
+0

Спасибо за ответ. Согласно документам, область фильтра - это порядок третьего уровня, а не для установки, где он применяется. – Luke

+1

Я не могу найти ни одного примера установки FilterScope, не так ли? – Luke

+0

@Coulton Да, я сказал, что речь идет только о 'ordering' и должна использоваться для сложной иерархии фильтров. – VMAtm

 Смежные вопросы

  • Нет связанных вопросов^_^