这是一个简单的问题。 stackoverflow是如何在Asp.net MVC中执行菜单的,突出显示了我们在上的页面。在Asp.NET MVC中突出显示的导航菜单?
回答
为了达到这个目的,我编写了一些代码,其中有一部分使用了我的自定义扩展,如语言,继续使用它,忽略小部分。
这个我放在我的部分顶部,包含菜单以获取操作和控制器,以便我可以将此传递给扩展。
<% string currentAction = ViewContext.RouteData.Values["action"].ToString();
string currentController = ViewContext.RouteData.Values["controller"].ToString(); %>
这是侧边栏项目,基本上这将生成一个链接,您的自定义类“礼”的标签,以表明是否链接在页面/高亮当前使用。
public static string SidebarItem(this System.Web.Mvc.HtmlHelper html, string currentAction, string currentController, string action, string controller, string languageKey, params object[] args)
{
TagBuilder tb = new TagBuilder("li");
if (string.Equals(currentAction, action, StringComparison.OrdinalIgnoreCase) && string.Equals(currentController, controller, StringComparison.OrdinalIgnoreCase))
{
tb.GenerateId("activemenu");
}
string text = html.Language(languageKey, args);
string link = html.ActionLink(text, action, controller).ToHtmlString();
tb.SetInnerText("{0}");
return String.Format(tb.ToString(), "<span>"+link+"</span>");
}
这里是代码的上述
<%= Html.SidebarItem(currentAction, currentController, "index", "home", "index") %>
见即这个URL
http://stackoverflow.com/questions
这表明可能是问题控制器处理这个页面。因此它会更改查看以显示突出显示的菜单项。
这就是基本思想。我猜测Linq to SQL模型中涉及到一些分页,除此之外。 – 2010-01-11 16:52:52
当然:)路由表,即 – 2010-01-11 16:54:29
堆栈溢出使用Linq to SQL模型? whaaaat? – nick 2011-01-15 20:45:13
有可能没有MVC特殊的魔法,使这种情况发生。
我敢肯定:
if(HttpContext.Current.Request.Path == "some some menu url")
或
if(ViewContext_Or_ControllerContext.RouteData.Values["controller"] == "some value")
使用某处。
您可以将此代码放在三个不同的位置(View(.aspx),ViewModel,Custom HtmlHelper),并且它们都需要相同的代码位。
这将是基本的。我会尝试找出最佳的方式来制作这个干燥的...:P – DucDigital 2010-01-12 03:13:14
如果您查看页面源,他们已将一个css类添加到<li>
元素以更改背景颜色。我猜测代码会查看用户访问什么控制器(问题,用户等),并将该类添加到该部分的<li>
标记。
这是UI的基础。 – DucDigital 2010-01-12 03:12:19
你可以使用HTML辅助创建菜单的实际使用情况。这样所有的代码都在一个地方。
SiteMap HtmlHelper ASP.NET MVC 有一些关于可用组件的信息。
1.首先创建extention
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; ;
}
}
的最佳方式 - 创建MVC助手(参见前面的答案) 但是,如果你不想这样做,并希望很快做 - 记住新功能MVC 4.0带有HTML标签属性的设置(属性将被避免,如果它被设置为空):
@{
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>
}
- 1. Asp.Net菜单突出显示
- 2. 使用jquery突出显示导航菜单中的父链接
- 3. 突出显示MVC 3中的菜单和子菜单?
- 4. 在ASP.Net中实现导航菜单MVC
- 5. 突出显示菜单栏航点
- 6. 如何突出显示导航菜单,指相同的URL
- 7. ASP.NET突出显示所选菜单项
- 8. jquery导航突出显示
- 9. 导航菜单突出显示活动页面?
- 10. 嵌套子菜单导航栏突出显示
- 11. 点击子菜单时,导航链接不会突出显示当前菜单
- 12. 突出显示在ASP.Net菜单中选中的选项卡
- 13. 突出显示菜单
- 14. 突出显示菜单项
- 15. jquery突出显示菜单
- 16. 在asp.net中显示子菜单mvc
- 17. KNP菜单 - 突出显示父菜单
- 18. Android删除导航菜单项突出
- 19. 导航菜单的菜单布局未显示在导航抽屉中
- 20. 如何突出显示导航栏抽屉菜单中的选定项目
- 21. 突出显示没有jQuery的导航
- 22. 导航上的突出显示链接
- 23. 导航div div中显示主菜单
- 24. 突出显示ASP.NET Web应用程序中的菜单栏
- 25. 航点菜单突出
- 26. 突出显示下拉菜单在Django
- 27. 导航菜单仅在Safari中显示出来。思考?
- 28. “Jquery制表符” - 在Asp.net mvc中的导航菜单样式?
- 29. 滑动突出显示导航栏
- 30. 突出显示活动导航:django 1.4.2
我相信我们做的事情非常相似:http://stackoverflow.com/questions/7970660/best-way-of-mark-the-current-navigation-item-in-a-menu/8041629#8041629 – Chris 2011-11-08 02:27:23