2015-09-03 15 views
7

Nel mio progetto mvc5 per disabilitare un collegamento d'azione per gli utenti non autorizzati che ho fatto come questoUso di User.IsInRole() in una visualizzazione

@if (User.IsInRole("Admin") | User.IsInRole("Manager")) 
{ 
     @Html.ActionLink("Add New Record", "ProductTypeIndex", "ProductType") 
} 

Ma se ci sono molti ruoli per controllare allora questo @If() diventa lungo Come evitare questo? Ho bisogno di aiutanti personalizzati per questo (se sì, come posso avvicinarmi)? Aiuto apprezzato ..

risposta

23

Si potrebbe scrivere il proprio metodo di estensione e utilizzarlo nel codice.

public static class PrincipalExtensions 
{ 
    public static bool IsInAllRoles(this IPrincipal principal, params string[] roles) 
    { 
     return roles.All(r => principal.IsInRole(r)); 
    } 

    public static bool IsInAnyRoles(this IPrincipal principal, params string[] roles) 
    { 
     return roles.Any(r => principal.IsInRole(r)); 
    } 
} 

Ora semplicemente si potrebbe chiamare questo metodo di estensione in questo modo:

// user must be assign to all of the roles 
if(User.IsInAllRoles("Admin","Manager","YetOtherRole")) 
{ 
    // do something 
} 

// one of the roles sufficient 
if(User.IsInAnyRoles("Admin","Manager","YetOtherRole")) 
{ 
    // do something 
} 

Mentre si potrebbe utilizzare questi metodi di estensione in vista pure ma cercare di evitare di scrivere la logica di applicazioni in vista il più possibile poiché le viste non sono facilmente testabili.

+0

Grazie mille per la soluzione :) Ci scusiamo per la risposta tardiva. Perché non potevo venire allo stackoverflow per pochi giorni. – Isuru

+1

L'ho modificato leggermente per poter utilizzare la stessa stringa dell'attributo authorize: 'Authorize (Roles =" group1, group2, group3 ")'. Puoi trovare la mia versione [qui] (https://gist.github.com/depuits/8ae37a2db0a44abea6bfc30c72349f27). In questo modo puoi anche usare: 'User.IsInAnyRoles (" group1, group2, group3 ")' – ColmanJ

-2
<% if (Page.User.IsInRole("Admin")){ %> 
+2

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entually-code-based-answers) aiuta davvero a migliorare la qualità del tuo inviare. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. –

+0

Questa è di gran lunga la risposta migliore e più semplice, ed è completamente auto-esplicativa. –

Problemi correlati