2015-08-17 17 views
6

Secondo questo documentation for ASP.NET Filters filtri gestita nel seguente ordine:Che cos'è Filter Scope e perché i nomi strani?

  1. filtri di autorizzazione
  2. filtri di azione
  3. filtri di risposta
  4. filtri di eccezione

Il all'interno di ogni tipo di filtro c'è un filtro Ordine che specifica l'ordine di esecuzione.

Ha senso fino ad ora ... ma poi diventa strano.

C'è un ulteriore metodo di ordinare all'interno di ogni tipo di filtro e l'ordine che è rappresentato come un'enumerazione dei seguenti valori:

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

Nei cuscinetto fa globale, Controller e azione hanno all'interno dell'ordine corsa per un filtro azione?

Ad esempio:

Se ho due filtri d'azione, sia con un ordine di esecuzione di 1 e FilterScope di controllore e azione, rispettivamente.

Diverso dall'ordinare l'uno di fronte all'altro, quale rilevamento ha Controller e Action su qualcosa?

Ulteriori bizarreness

According to this la FilterScope fornisce terzo livello di ordinamento per filtri. In che modo Controller, Global o Action un ordine per un filtro che non è in alcun modo limitato per l'uso solo su un Controller, Action e non necessariamente applicato globalmente? Non è descrittivo di un ordine.

Inoltre, se fornisce un filtro di terzo livello, perché è limitato solo alle 5 opzioni?

+0

Penso che 'FilterScope' definisca dove si utilizza il filtro: globalmente, sull'intero controller o su qualche azione. Quindi il primo che verrà eseguito sarà un filtro globale, quindi il controller e quindi l'azione –

+0

Ciò ti aiuterà: https://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v= vs.118) .aspx? – Marco

+0

@VsevolodGoloviznin Ho pensato la stessa cosa, ma questo non spiega perché è specificato per ogni 'tipo di filtro e ordine ', sarebbe sicuramente sopra questi. Quindi sarebbe: Filter Scope, Filter Type, Filter Order. Non il contrario? – Luke

risposta

3

Filter oggetti, gli oggetti che in realtà hanno una proprietà Scope, sono costruiti in base all'utilizzo - quando si aggiunge un filtro per l'applicazione globale filtri, un oggetto Filter viene creato con un Scope di Global. Allo stesso modo, quando gli attributi del filtro vengono raccolti dal controller e dall'azione, gli oggetti Filter vengono costruiti utilizzando gli ambiti Controller e Action, rispettivamente.

non sono del tutto sicuro di come un Filter con un Scope di First o Last in realtà viene creato.

Queste regole sono specificate per dire come verrà applicato il tie-break nel caso in cui un filtro venga dichiarato, ad esempio, a livello globale e a livello di azione utilizzando lo stesso valore Order, il che è più preoccupante dei filtri dichiarati allo stesso livello in cui ci si aspetta che manualmente ciascun filtro utilizzi un unico Order (se si preoccupa di ordinare).

+1

Penso che il valore predefinito sia 'First' dato che è un primo di enum', che porta la sua uguaglianza a' 0' – VMAtm

2

Beh, non riesco davvero a capire cosa esattamente trovi come un bizarreness qui. filtri

autorizzazione, Azione, di risposta e di eccezione sono 4 interfacce è possibile implementare per eseguire la logica di filtro, IAuthorizationFilter, IActionFilter, IResultFilter e IExceptionFilter interfacce, rispettivamente.

Dopodiché, le regole aziendali vengono alla luce. Ad esempio, è necessario controllare i diritti di accesso per alcune azioni dell'utente. Non hai solo implementato il filtro di autorizzazione, ma crea una logica per controllare regole come:

  • Se l'utente non ha terminato la registrazione, devi ricordarglielo. Questa regola deve essere eseguita a First, indipendentemente da ciò che l'utente fa sul tuo sito.
  • Se l'utente non è stato approvato, non può visualizzare il contenuto del sito e deve ottenere un messaggio di convalida.Quindi è una regola con scope Global e dovrebbe essere eseguita prima di qualsiasi altra verifica per i diritti utente.
  • Se l'utente non ha accesso per alcuni reparti, non può visualizzare alcuni contenuti sul sito relativi a quel dipartimento, ma non tutti - quindi lasciamo che sia Controller a scegliere, cosa deve essere visualizzato all'utente.
  • Se l'utente non è un gestore, non può modificare o eliminare alcuni contenuti. Quindi, questo è un Action concreto che viene filtrato.
  • Siamo in grado di avviare alcuni logger dopo l'elaborazione dell'elaborazione, quindi dobbiamo attendere il completamento del lavoro ed eseguire il filtro su Last.

vedo qui un modello molto semplice per il filtro ordinare, e posso fornire un campione per ogni coppia o filter type/filter scope.

Aggiornamento:

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

Grazie per la risposta. Secondo i documenti, l'ambito del filtro è ordinamento di terzo livello, non per l'impostazione in cui viene applicato – Luke

+1

Non riesco a trovare neanche un singolo esempio di FilterScope impostato, vero? – Luke

+0

@Coulton Sì, ho affermato che si tratta solo di 'ordering', e dovrebbe essere usato per la complessa gerarchia dei filtri. – VMAtm