C'est une question simple. Comment StackoverFlow a-t-il effectué son menu dans ASP.NET MVC, avec
7 Réponses :
voir pour i.e. cette URL p>
http://stackoverflow.com/questions code> Cela indique que probablement les questions
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?
Il n'y a probablement pas de magie spéciale MVC qui fait cela arriver.
Je suis sûr: p> ou p> est utilisé quelque part. p> 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. p> p>
Ce sera le basique. Je vais essayer de comprendre le meilleur moyen de faire ce sèche ...: P
Si vous regardez la source de la page, ils ont ajouté une classe CSS à l'élément
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. p> 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. p> et voici l'utilisation réelle du code ci-dessus p>
Je crois que nous faisons beaucoup de choses: Stackoverflow.com/questions/7970660/...
Vous pouvez utiliser une aide HTML pour créer le menu. De cette façon, tout le code est au même endroit. P>
Sitemap HTMLHelper ASP.NET MVC A quelques informations sur un composant disponible? P>
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; ;
}
}
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>
}