2009-06-27 7 views
1

Ich entwickle eine Website in ASP.NET MVC, wo ich verschiedene Abschnitte einer Ansicht für Benutzer mit verschiedenen Sicherheitsstufen anzeigen möchte. Im Wesentlichen sind die Ansichten identisch, aber Benutzer mit höheren Sicherheitsstufen müssen Abschnitte anzeigen können, die nicht von Benutzern mit Sicherheitsstufen oberhalb von beispielsweise Administratoren angezeigt werden sollten.So zeigen Sie verschiedene Ansichtsabschnitte in einer objektorientierten Weise an

Ich weiß nicht, wie das in einer objektorientierten Weise zu tun ist. Ich denke, das kann mit Vererbung gemacht werden, aber ich weiß nicht, wie man Vererbung in der Ansicht implementiert.

Auch weiß ich, ich ein viel ifs codieren kann, etwas zu tun, wie

<% if (User has some security level) { %> 
    <span>show this info</span> 
<% } %> 

aber nicht gut riechen. Tatsache ist, dass ich nicht weiß, ob ich objektorientierte Prinzipien oder Design für diese Aufgabe verwenden soll.

Ich denke, das ist eine häufige Aufgabe, also denke ich, es gibt ein Muster, um diese Aufgabe zu erfüllen. Beispielsweise führt Stackoverflow dies aus, wenn dem Benutzer, der eine Frage (oder eine Antwort oder einen Kommentar) gepostet hat, einige Optionen (Bearbeiten, Löschen usw.) angezeigt werden und dieselben Optionen für alle anderen ausgeblendet werden.

Antwort

0

Je nach Komplexität Ihrer Aufgabe kann die if-Anweisungsroute ausreichen. Wenn nicht, dann könnten Sie Teilansichten verwenden und eine HtmlHelper-Erweiterung schreiben, mit der Sie partiell basierend auf einer bestimmten Rolle rendern können. Es könnte wie folgt aussehen:

<% Html.RenderPartialWithRole("AdminSection", 
           Model, 
           ViewData, 
           User, 
           "Administrator", 
           null) %> 


public static void RenderPartialWithRole(this HtmlHelper helper, 
              string partialName, 
              object model, 
              ViewDataDictionary viewData, 
              IPrincipal user, 
              string role, 
              object htmlAttributes) 
{ 
    if (user != null && !string.IsNullOrEmpty(role) && user.IsInRole(role)) 
    { 
      helper.RenderPartial(partialName, model, viewData, htmlAttributes); 
    } 
} 
0

eine stark typisierte Ansicht verwenden, hat eine Boolesche Eigenschaft auf Ihrem Modell wie ShowSection (einen für jeden Abschnitt, Logik in Ihrem controllor eingestellt). Habe die Abschnitte in Divtags mit guten IDs. Verwenden Sie dann JavaScript oder jquery, um den Anzeigestil für div-Tags basierend auf der booleschen Eigenschaft festzulegen.

+0

Dies ist nicht objektorientiert, und wenn die Benutzer hat Javascript deaktiviert funktioniert nicht – eKek0

+0

Ich stimme eKek0 zu. Darüber hinaus bin ich der festen Überzeugung, dass Views keine Logik haben sollten, was auch immer. Mit anderen Worten, der in einer Ansicht eingebettete Code sollte eine zyklomatische Komplexität von 1 haben; d.h. keine "if" -Anweisungen. –

+0

Ich denke, Sie sind zu besorgt darüber, es zu tun OO - Ihre Ansicht sollte dumm sein und alle Logik in der Steuerung sein, nur die Informationen durch ein Modell benötigt –

0

Sie könnten alle Abschnitte in Teiltabellen mit Ansichten haben, die so aufgebaut sind, dass sie die Abschnitte enthalten, die für die verschiedenen Berechtigungsstufen verfügbar sind. Also eins für Admins, eins für jedes Level. Dann hat Ihr Controller die Logik, um zu entscheiden, welche Ansicht verwendet werden soll. Also wäre jeder OO Teil in der Steuerung, nicht die Ansicht.

0

Dies ist kein objektorientierter Ansatz, aber es ist verwandt. Der interessante Teil dieser Frage ist, wie man mit den if-Anweisungen zurechtkommt. Die übliche Methode, um If's oder Case's loszuwerden, ist die Verwendung einer Nachschlagetabelle mit Kriterien und Effekten. Es gibt andere Techniken, die dieselbe Idee verwenden, wie zum Beispiel datengerichtete Programmierung (http://en.wikipedia.org/wiki/Data-directed___programming) und Versandtabellen (http://en.wikipedia.org/wiki/Dispatch_table). Viele Sprachimplementierungen verwenden Typ-Dispatch-Tabellen, um virtuelle Methodenaufrufe zu implementieren.

Wenn angenommen wird, dass Teilansichten für dieses Problem in Ordnung sind, könnte es sich bei der Nachschlagetabelle um eine Liste von Paaren handeln. Das erste Element des Paares ist ein Rollenname, der mit dem aktuellen Benutzer verglichen werden soll. Das zweite Element des Paars ist der Name der Teilansicht, die gerendert werden soll, wenn die Rollenüberprüfung erfolgreich ist.

Wir initialisieren die Tabelle in der Steuereinheit (oder wo auch immer) und Zuweisen zu Viewdata, dann Html.RenderViewByRole verwenden, um die richtige Teilansicht zu wählen und machen:

<% Html.RenderPartialByRole(User, (List<Dispatch>)ViewData["rolePartial"]); %> 

public static class MyHelper { 
    public static void RenderPartialByRole(this HtmlHelper helper, IPrincipal user, List<Dispatch> rolePartial) { 
     foreach (Dispatch d in rolePartial) { 
      if (d.CheckRole(user)) { 
       helper.RenderPartial(d.PartialName); 
       break; 
      } 
     } 
    } 
} 

public class Dispatch { 
    string _roleName; 
    string _partialName; 

    public Dispatch(string roleName, string partialName) { 
     _roleName = roleName; 
     _partialName = partialName; 
    } 
    public bool CheckRole(IPrincipal user) { 
     return user.IsInRole(_roleName); 
    } 
    public string PartialName { 
     get { return _partialName; } 
    } 
} 

public class HomeController : Controller { 

    List<Dispatch> rolePartial = new List<Dispatch>(); 
    private void InitTable() { 
     rolePartial.Add(new Dispatch("admin", "adminPartial")); 
     rolePartial.Add(new Dispatch("report", "reportPartial")); 
     rolePartial.Add(new Dispatch("guest", "guestPartial")); 
    } 

    public HomeController() { 
     InitTable(); 
    } 

    public ActionResult Index() { 
     ViewData["rolePartial"] = rolePartial; 
     return View(); 
    } 
} 
Verwandte Themen