2015-09-03 8 views
7

In meinem mvc5 Projekt einen Aktionslink für nicht autorisierte Benutzer zu sperren Ich mag dieses Verwendung von User.IsInRole() in einer Ansicht

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

tat Aber wenn es viele Rollen dann diese @if zu überprüfen() wird lang. Wie vermeide ich das? Brauche ich hierfür angepasste Helfer (wenn ja, wie kann ich damit umgehen)? Hilfe geschätzt ..

Antwort

23

Sie könnten Ihre eigene Erweiterungsmethode schreiben und verwenden Sie es in Ihrem Code.

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)); 
    } 
} 

Jetzt einfach können Sie diese Erweiterungsmethode wie folgt aufrufen:

// 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 
} 

Während Sie diese Erweiterungsmethoden in Aussicht als auch nutzen könnten aber versuchen, Ihre Apps Logik in den Ansichten so weit wie möglich zu vermeiden, Schreiben da Ansichten nicht einfach testbar sind.

+0

Vielen Dank für die Lösung :) Sorry für die späte Antwort. Weil ich für einige Tage nicht zum Stackoverflow kommen konnte. – Isuru

+1

habe ich es leicht die gleiche Zeichenfolge wie im autorisieren Attribute zu verwenden, verwenden können: 'Autorisieren (Roles =„Gruppe1, Gruppe2, group3“)'. Sie können meine Version [hier] finden (https://gist.github.com/depuits/8ae37a2db0a44abea6bfc30c72349f27). Auf diese Weise können Sie auch verwenden: 'User.IsInAnyRoles (" group1, group2, group3 ")' – ColmanJ

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

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres zu verbessern Post. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. –

+0

Dies ist bei weitem die beste und einfachste Antwort und ist völlig selbsterklärend. –