2010-09-04 16 views
26

Ich muss aktiven Link im Menü markieren. Mein Menü befindet sich übrigens auf der Masterseite. Ich suche den besten Weg, dies zu implementieren? Irgendwelche Ideen?Asp.Net Mvc Hervorhebung aktuelle Seite Link-Technik?

+0

Hw speichern Sie Menü haben? Sie können sie mit Controller und Aktion verknüpfen und basierend auf diesen Werten markieren. – LukLed

+0

Ich speichere sie in einer Masterpage als statisch. – beratuslu

+0

Bereits hier behandelt? Siehe: http://StackOverflow.com/Questions/1471362/How-to-visuell-indicate-current-page-in-asp-net-mvc – thmshd

Antwort

39

Der beste Weg, dies zu umgehen, ist ein HTML-Helfer zu schreiben. Sie könnten RouteData.Values["action"] verwenden, um die aktuell ausgeführte Aktion abzurufen und mit dem Menünamen zu vergleichen. Wenn sie übereinstimmen, wenden Sie eine CSS-Klasse an, die sie hervorhebt.

public static MvcHtmlString MenuItem(
    this HtmlHelper htmlHelper, 
    string action, 
    string text 
) 
{ 
    var menu = new TagBuilder("div"); 
    var currentAction = (string)htmlHelper.ViewContext.RouteData.Values["action"]; 
    if (string.Equals(
      currentAction, 
      action, 
      StringComparison.CurrentCultureIgnoreCase) 
    ) 
    { 
     menu.AddCssClass("highlight"); 
    } 
    menu.SetInnerText(text); 
    return MvcHtmlString.Create(menu.ToString()); 
} 

Und dann diese Helfer verwenden, um die Menüpunkte zu machen:

<%: Html.MenuItem("about", "About us") %> 
<%: Html.MenuItem("contact", "Contact us") %> 
... 
+2

Hallo, Darin. Wo setzt man HTML-Helfer ein? Ein neuer Ordner und dann "importieren", um es aufzunehmen? Wie kann ich das verwenden? Vielen Dank. – user1477388

+0

ja, wo, das zu setzen? – 4pie0

+2

Es gibt keine Konvention oder einen bestimmten Ort, um die benutzerdefinierten HTML-Helfer zu platzieren. Persönlich lege ich die Erweiterungsmethoden in einen Helfer-Ordner. –

0

Ich bin mir ziemlich sicher, dass Sie dies mit reinem CSS tun können. Es beinhaltet Klassenselektoren und das Faffing mit dem Body-Tag. Ich würde jeden Tag in der Woche mit der Helfer-Methode gehen.

0

Ich benutze diese Lösung:

Erste - fügen Sie Attributdaten-menuPageId zu Ihrem Menü verbindet

<ul class="menu"> 
    <li data-menuPageId="home"> 
      @(Html.Link<HomeController>(x => x.Index(), "Home")) 
    </li> 
    <li data-menuPageId="products"> 
      @(Html.Link<ProductsController>(x => x.Index(), "Products")) 
    </li> 
</li> 

Next - für die aktuelle Seite verstecktes Feld hinzufügen Id

<input type="hidden" id="currentPageId" value="@(ViewBag.Page ?? "home")" /> 
Layout.cshtml

Fügen Sie ViewBag.Page initialization auf Ihren Seiten hinzu, wie Home oder Produkte

@{ 
    ViewBag.Page = "products"; 
} 

Und letzte, was sollten Sie diese JavaScipt von Yor Layout.cshtml Referenz

$(function() { 
    var pageIdAttr = "data-menuPageId"; 
    var currentPage = $("#currentPageId").attr("value"); 

    var menu = $(".menu"); 

    $("a[" + pageIdAttr + "]").removeClass("selected"); 
    $("a[" + pageIdAttr + "=\"" + currentPage + "\"]", menu).addClass("selected"); 
}); 
7

ich immer diese Lösung bin mit Html Teil

<ul> 
    @Html.ListItemAction("Home Page","Index","Home") 
    @Html.ListItemAction("Manage","Index","Home") 
</ul> 

Helper Teil

public static class ActiveLinkHelper 
    { 
     public static MvcHtmlString ListItemAction(this HtmlHelper helper, string name, string actionName, string controllerName) 
     { 
     var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"]; 
     var currentActionName = (string)helper.ViewContext.RouteData.Values["action"]; 
     var sb = new StringBuilder(); 
     sb.AppendFormat("<li{0}", (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && 
              currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase) 
               ? " class=\"active\">" : ">")); 
     var url = new UrlHelper(HttpContext.Current.Request.RequestContext); 
     sb.AppendFormat("<a href=\"{0}\">{1}</a>", url.Action(actionName, controllerName), name); 
     sb.Append("</li>"); 
     return new MvcHtmlString(sb.ToString()); 
    } 
} 
0

In Layout versuchen wie folgt:

@{ 
    string url = Request.RawUrl; 
} 
@switch (url) 
{ 
    case "/home/":     
     @Html.ActionLink("Home", "../home/", null, new { @style = "background:#00bff3;" }) 
     @Html.ActionLink("Members", "../home/MembersList/") 
    break; 
    case "/home/MembersList/": 
     @Html.ActionLink("Home", "../home/") 
     @Html.ActionLink("Members", "../home/MembersList/", null, new { @style = "background:#00bff3;" }) 
    break; 
    default: 
      @Html.ActionLink("Home", "../home/") 
      @Html.ActionLink("Members", "../home/MembersList/") 
    break; 
} 
Verwandte Themen