2013-03-14 8 views
9

Sto pensando di utilizzare un controller di base per l'intero progetto MVC 4 su cui sto lavorando. Ho trovato opinioni contrastanti online su di esso e non sono sicuro se sia contro le migliori pratiche o se si tratti solo di preferenze personali.utilizzando un controller di base per l'intero progetto asp.net MVC 4

Ecco un post che dice StackOverflow dont do it

Here è un post che ha dimostrato come si fa come se non ci sono effetti nocivi di esso. Here e here e spiegano il suo utilizzo in cui nessuno sottolinea che si tratta di pratiche scorrette o che potrebbero portare a problemi futuri.

Allora, qual è realmente la vista sull'utilizzo di un paio di controller di base in un progetto di 4 MVC? Buona? Cattivo?

Modifica

Vorrei anche sottolineare che il mio obiettivo immediato per l'utilizzo di un controller di base è così che io possa avere l'autorizzazione fatto in un controller e in modo che tutti i controllori non hanno bisogno di avere l'attributo Authorize. Creerò controller di base separati per ciascun ruolo. Poiché i ruoli non cambieranno mai, non avrò mai bisogno di creare un altro controller di base per un altro ruolo. Cosa ne pensi di questo modo di progettare i controller?

Grazie per il vostro tempo.

risposta

3

ho usato un controller di base prima di quando si tratta di cose come sovrascrivendo il principale User (vedi qui per una vecchia questione di mine descrivendo l'idea: Is this Custom Principal in Base Controller ASP.NET MVC 3 terribly inefficient?).

Onestamente non poteva pensare ad un modo migliore di fare questo, quindi mi sento che in questo tipo di scenario utilizzando un controller di base può essere una buona cosa.

Probabilmente non avrei controller di base diversi per diversi ruoli di autorizzazione, dato che è abbastanza semplice (e meno codice) solo per decorare il controller con [Authorize(Roles="whatever")] e sarà più facile vedere esattamente cosa sta succedendo.

Può valere la pena considerare una consuetudine AuthorizeAttribute.

+0

vedi questo. Stavo cercando di evitare di decorare ogni controller con l'attributo authorize. Voglio solo che gli sviluppatori junior sappiano che se stanno lavorando su una pagina a cui solo un amministratore può accedere, dovrebbero ereditare da AdminController. Vorrei enum ognuno di questi ruoli con Admin come il numero 1 sulla lista .. quindi nel mio attributo di autorizzazione personalizzato posso avere solo un controllo maggiore o minore del valore enum fornito dal controller di base – user20358

+0

Il problema può sorgere se avete requisiti complessi su quali ruoli sono autorizzati a fare quali cose. Sto parlando se i requisiti cambiano in seguito. Decorare i controller con una sorta di "AuthorizateAttribute" personalizzato è probabilmente migliore (vedi link nella risposta modificata). –

+0

Grazie. lo verificherà. – user20358

4

IMHO ciò che il post che fa riferimento dice è assolutamente vero, ma non è una ragione per non utilizzare un controller di base. In effetti io uso un controller di base in alcune delle mie applicazioni ASP.NET MVC a causa della merce.

Questo non è più consigliabile:

avere un controller di base per applicare la [Autorizza] attributo di una volta è una pratica comune, e non vedo nulla di male su di esso.

Dal MVC3 è possibile registrare filtri d'azione a livello mondiale in questo modo:

GlobalFilters.Filters.Add(new MyAuthorizeAttribute());

+0

Grazie per la risposta. Pensi che avere più ruoli sia un problema? Quindi per ogni ruolo avrei bisogno di un controller separato. Un controller di base per Admin. In modo che solo le pagine di amministrazione ereditino da quel particolare controller. Analogamente per altri ruoli. – user20358

+0

Se tutte le azioni di un controller sono autorizzate per gli stessi ruoli, non vedo un problema utilizzando un controller di base separato per ciascun ruolo. Ma se si dispone di controller con azioni autorizzate a un set di ruoli e altre azioni autorizzate a un altro set di ruoli, è possibile che si debba provare un approccio alternativo. – eiximenis

Problemi correlati