2009-01-24 5 views
7

Gibt es eine bessere Möglichkeit, dies zu tun?asp.net mvc und css: Menüleiste bleibt auf Auswahl markiert

Ich habe eine HTML-Helfer-Erweiterung-Methode, die überprüft, ob das aktuelle Registerkartenmenü das ausgewählte ist und wählt dann .selected CSS-Klasse oder nicht. Ich legte den html.IsSelected Link in jedem li als

<li class="<%=Html.IsSelected(string a, string b)%>" > 

wobei a der Registerkarte Name und b Viewdata zugewiesen.

ist das sauber oder gibt es einen besseren Weg?

Antwort

2

Wenn Sie mit einer JavaScript-Lösung leben können, sehen Sie sich an, wie das jQuery UI Accordion-Plugin dies handhabt. Im Wesentlichen können Sie die hervorgehobene Registerkarte basierend auf dem Controller auswählen, indem Sie die Anforderungs-URL beim Laden der Seite überprüfen.

Alternativ können Sie für jede Registerkarte, die dem Klassenwert der Registerkarte entspricht, ein ViewBag-Element festlegen. Legen Sie den Wert für die aktuelle Registerkarte auf die aktive CSS-Klasse und die anderen leer (oder ihre Standardwerte) fest. Dann können Sie verwenden:

<li id="HomeTab" class="<%= ViewBag.HomeTabClass %>" /> 
<li id="OtherTab" class="<%= (string)ViewBag.OtherTabClass %>" /> 

In Ihrem Controller würden Sie dann die richtigen Werte für die ViewData-Variablen einrichten.

ViewBag.HomeTabClass = "tab activeTab"; 
ViewBag.OtherTabClass = "tab"; 
+0

das ist was ziemlich was ich tat, ViewData verwendet, um Klasse zuzuweisen. Würden Sie sagen, dass die Java-Lösung aus irgendeinem bestimmten Grund effizienter oder besser ist? – zsharp

+1

Die Verwendung der JavaScript-Lösung verhindert, dass Sie Code zu jeder Aktion hinzufügen müssen, um die richtige Registerkarte zu setzen, obwohl Sie im Prinzip dasselbe erreichen könnten, wenn Sie OnActionExecuting implementieren. Der Nachteil der Verwendung von Javascript ist es kaputt, wenn Javascript deaktiviert ist. – tvanfosson

+0

Wenn ich mehr als fünf Menüpunkte und Unterpunkte habe, wie kann ich Ihre Antwort verwenden? –

5

Dieser Ansatz, den ich in einem meiner Projekte mit bin und ziemlich gut funktioniert. Ich habe in jedem Controller ViewData ["Home"] = "activeTab" -Klasse zugewiesen und verwende in der Ansicht einen Standardwert für eine leere Zeichenfolge, wie unten gezeigt. Dadurch wird die Registerkarte aktiviert, wenn der Wert dieses viewData-Wörterbuchs verwendet wird. Ist einfach und sehr sauber.

Ihre Heimsteuerung wird wie folgt aussehen:

 ViewData["Home"] = "activeTab"; 

     return View("Index"); 
    } 

Die Ansicht wird wie folgt aussehen:

<li class="<%= ((string)ViewData["Home"] ?? "") %>"><%= Html.ActionLink("Home", "Index", "Home")%></li> 
<li class="<%= ((string)ViewData["About"] ?? "") %>"><%= Html.ActionLink("About", "About", "Home")%></li> 
1

Ich habe versucht, dies ohne Glück zur Arbeit zu kommen.

Wie sieht Ihr CSS aus? Meine ist unten.

.activeTab { Hintergrund: #FFFFFF; Farbe: # 000000; }

Ich benutze dies mit der Masterseite und nicht die Home-Ansicht, nicht sicher, ob das Auswirkungen hat.