10
votes

Menu de navigation avec la surbrillance dans ASP.NET MVC?

C'est une question simple. Comment StackoverFlow a-t-il effectué son menu dans ASP.NET MVC, avec surlignage sur quelle page nous sommes sur .


0 commentaires

7 Réponses :


0
votes

voir pour i.e. cette URL

http://stackoverflow.com/questions Cela indique que probablement les questions contrôleur gère cette page. Donc, il change la vue pour afficher un élément de menu en surbrillance.


2 commentaires

C'est l'idée de base. Je suppose qu'il y a une certaine pagination impliquée dans les modèles Linq aux SQL, entre autres.


Stack Overflow utilise des modèles LINQ vers SQL? Whaaaat?



3
votes

Il n'y a probablement pas de magie spéciale MVC qui fait cela arriver.

Je suis sûr: xxx

ou xxx

est utilisé quelque part.

Vous pouvez mettre ce code dans environ trois endroits différents (vue (.aspx), viewModel, htmlhelper personnalisé) et ils nécessiteraient tous le même bit de code.


1 commentaires

Ce sera le basique. Je vais essayer de comprendre le meilleur moyen de faire ce sèche ...: P



0
votes

Si vous regardez la source de la page, ils ont ajouté une classe CSS à l'élément

  • pour changer la couleur d'arrière-plan. Je suppose que le code regarde quel contrôleur l'utilisateur accède à (questions, utilisateurs, etc.) et ajoute la classe à la balise
  • de cette section.

  • 0 commentaires

    3
    votes

    Dans le but de cela, j'ai écrit un certain code, il y a une partie qui utilise ma langue personnalisée comme une langue, allez-y et utilisez-la, ignorez simplement la partie mineure.

    Celui-ci je place sur le dessus de mon partial contenant le menu pour obtenir l'action et le contrôleur, de sorte que je puisse transmettre ceci à l'extension. xxx

    Il s'agit de l'élément de barre latérale, essentiellement, cela générera un "Li" balise avec un lien et votre classe personnalisée pour indiquer si le lien est actuellement utilisé dans la page / la surbrillance. xxx

    et voici l'utilisation réelle du code ci-dessus xxx


    1 commentaires

    Je crois que nous faisons beaucoup de choses: Stackoverflow.com/questions/7970660/...



    0
    votes

    Vous pouvez utiliser une aide HTML pour créer le menu. De cette façon, tout le code est au même endroit.

    Sitemap HTMLHelper ASP.NET MVC A quelques informations sur un composant disponible?


    0 commentaires

    1
    votes

    1.First Créer une extension

    public class Extention
    {
        public static Dictionary<Menu, Menu> GetDictionary()
        {
            Dictionary<Menu, Menu> urls = new Dictionary<Menu, Menu>();
            urls.Add(new Menu { Controller = "AppHome", Action = "Index" }, new Menu { Controller = "AppHome", Action = "Index" });
            urls.Add(new Menu { Controller = "Home", Action = "Index" }, new Menu { Controller = "Home", Action = "Index" });
    
            return urls;
        }
    }
    public static class HtmlExtensions
    {
        public static MvcHtmlString ActionMenu(this HtmlHelper helper,String linkText,string actionName,String controllerName)
        {
            var tag= new TagBuilder("li");
            if(helper.ViewContext.RequestContext.IsCurrentRoute(null,controllerName,actionName)||
                helper.ViewContext.RequestContext.IsParentRoute(controllerName,actionName))
            {
                tag.AddCssClass("active");
            }
            else
            {
                tag.AddCssClass("inactive");
            }
            tag.InnerHtml = helper.ActionLink(linkText, actionName, controllerName).ToString();
            return MvcHtmlString.Create(tag.ToString());
        }
    }
    public static class RequestExtentions
    {
        public static bool IsCurrentRoute(this RequestContext context, String areaName)
        {
            return context.IsCurrentRoute(areaName, null, null);
        }
        public static bool IsCurrentRoute(this RequestContext context, String areaName, String controllerName)
        {
            return context.IsCurrentRoute(areaName, controllerName, null);
        }
        public static bool IsCurrentRoute(this RequestContext context, String areaName, String controllerName, params String[] actionNames)
        {
            var routeData = context.RouteData;
            var routeArea = routeData.DataTokens["area"] as String;
            var current = false;
    
            if (((String.IsNullOrEmpty(routeArea) && String.IsNullOrEmpty(areaName)) || (routeArea == areaName)) &&
                 ((String.IsNullOrEmpty(controllerName)) || (routeData.GetRequiredString("controller") == controllerName)) &&
                 ((actionNames == null) || actionNames.Contains(routeData.GetRequiredString("action"))))
            {
                current = true;
            }
            return current;
        }
        public static bool IsParentRoute(this RequestContext context, String controller, String action)
        {
            var routeData = context.RouteData;
            Menu returnUrl = null;
            Menu requestUrl = new Menu { Action = routeData.GetRequiredString("action"), Controller = routeData.GetRequiredString("controller") };
            Menu linkUrl = new Menu { Action = action, Controller = controller };
    
            var urls = Extention.GetDictionary();
            urls.TryGetValue(requestUrl, out returnUrl);
    
            if (returnUrl != null && returnUrl.Equals(linkUrl))
                return true;
            else
                return false; ;
        }
    }
    


    0 commentaires

    0
    votes

    Le meilleur moyen - Créez une assistante MVC (voir les réponses précédentes) Mais si vous ne voulez pas le faire et que vous ne voulez pas faire rapidement - rappelez-vous de la nouvelle fonctionnalité de MVC 4.0 avec les attributs définis des balises HTML (l'attribut évitera si elle est définie sur NULL):

            @{
                string currentAction = ViewContext.RouteData.Values["action"].ToString().ToLower();
    
                string classUpcomingTime = null;
                string classArchive = null;
                string classReporting = null;
    
                switch (currentAction)
                {
                    case "upcomingtime":
                        classUpcomingTime = "active";
                        break;
                    case "archive":
                        classArchive = "active";
                        break;
                    case "reporting":
                        classReporting = "active";
                        break;
                }
    
                <ul class="nav navbar-nav">
                    <li class="@classUpcomingTime">
                        <a href="/Vacancy/UpcomingTime">Open Vacancies</a>
                    </li>
                    <li class="@classArchive">
                        <a href="/Vacancy/Archive">Archive</a>
    
                    <li class="@classReporting">
                        @*<a href="#">Reporting</a>*@
                        <a href="/Vacancy/Reporting">Reporting</a>
                    </li>
                </ul>
            }
    


    0 commentaires