2011-07-03 12 views
40

W MVC możemy ozdobić metody działania z różnymi filtrami jakW jakiej kolejności są filtry wykonany w ASP.NET MVC

[HttpPost] 
[Authorize] 
public ActionResult mymethod(){} 

HttpPost wywodzi MethodSelectorAttribute (prawdopodobnie pośrednio) i atrybut Authorize dziedziczy ActionFilterAttribute.

Moje pytanie brzmi: w jakiej kolejności są wykonywane w potoku żądania MVC? Próbowałem wyszukiwać w kodzie źródłowym MVC, ale nie znalazłem odpowiednich bitów kodu.

+0

Przyjęłbym kolejność, w jakiej są zwracane podczas refleksji, na którą może wpłynąć faktyczna kolejność w źródle. –

+0

@ Hasan bhai przede wszystkim miło cię widzieć, to uważam, że HttpPost jest actionmethodSelector (jego metoda isValidForRequest nazywa się) atrybut i Authorize to atrybut actionFilter (jego nazwa to onActionExecuting lub onActionExecuted), więc muszą być wywoływane w różnym czasie. prawdopodobnie HttpPost powinien zostać wywołany przed Authorize, ponieważ są to różne filtry i mają różne obowiązki. –

+0

Wygląda na to, że moje założenie było błędne. Odpowiedź Erangi pokazuje, że Filtry mają mechanizm określający ich kolejność. Jednak ponieważ HttpPost nie jest filtrem, jak się wydaje. Może to wymagać specjalnej obsługi, wykonując ją przed czymkolwiek innym. Znowu jego założenie. –

Odpowiedz

60

Filtry uruchamiane w następującej kolejności:

  1. filtry autoryzacji
  2. filtry akcji
  3. filtry Odpowiedź
  4. filtry wyjątków

Na przykład, filtry zezwoleń uruchomić pierwszy i filtrów wyjątków biegnij ostatni. W każdym typie filtru wartość Order określa kolejność wykonywania. W każdym typie i kolejności filtrów wartość wyliczenia zakresu określa kolejność filtrów. To wyliczenie określa następujące wartości filtra Zakres (w takiej kolejności, w jakiej RUN):

  1. First
  2. Globalny
  3. Controller
  4. Action
  5. Ostatnie

ekstrahowane z MSDN

+1

HttpPost nie jest żadnym z wyżej wymienionych filtrów jest MehodSelectorAttribute –

+2

Tak, jest używany do wyboru metody działania, jeśli jest wielu kandydatów. Jest to więc atrybut znacznika. Jest używany przed filtrami są wykonywane – Eranga

+1

odwiedź http://zahidadeel.blogspot.com/2011/07/ajaxonly-attribute-actionfilter-vs.html dla dalszych szczegółów –

19

Aby zapisać ty jakiś czas, jest to, w jaki sposób ustawić kolejność:

[MyCustomContextFilter(Order=1)] 

Indeks jest 0, tak więc można zrobić, 0, 1, 2, etc ...

Należy zauważyć, że tylko ponieważ filtr znajduje się w klasie bazowej nie mówi MVC, aby zastosował go najpierw :(.

+2

Również filtry bez określonej kolejności są uruchamiane przed filtrami z zamówieniem. Dotyczy to kontekstu typu filtra (autoryzacja, akcja itp.). –

+0

NB. Filtry wyjątków działają w odwrotnej kolejności! (Tak naprawdę :/) – Haohmaru

Powiązane problemy