2010-01-11 51 views

回答

3

为了达到这个目的,我编写了一些代码,其中有一部分使用了我的自定义扩展,如语言,继续使用它,忽略小部分。

这个我放在我的部分顶部,包含菜单以获取操作和控制器,以便我可以将此传递给扩展。

<% 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") %> 
+0

我相信我们做的事情非常相似: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

0

见即这个URL

http://stackoverflow.com/questions这表明可能是问题控制器处理这个页面。因此它会更改查看以显示突出显示的菜单项。

+0

这就是基本思想。我猜测Linq to SQL模型中涉及到一些分页,除此之外。 – 2010-01-11 16:52:52

+0

当然:)路由表,即 – 2010-01-11 16:54:29

+0

堆栈溢出使用Linq to SQL模型? whaaaat? – nick 2011-01-15 20:45:13

3

有可能没有MVC特殊的魔法,使这种情况发生。

我敢肯定:

if(HttpContext.Current.Request.Path == "some some menu url") 

if(ViewContext_Or_ControllerContext.RouteData.Values["controller"] == "some value") 

使用某处。

您可以将此代码放在三个不同的位置(View(.aspx),ViewModel,Custom HtmlHelper),并且它们都需要相同的代码位。

+0

这将是基本的。我会尝试找出最佳的方式来制作这个干燥的...:P – DucDigital 2010-01-12 03:13:14

0

如果您查看页面源,他们已将一个css类添加到<li>元素以更改背景颜色。我猜测代码会查看用户访问什么控制器(问题,用户等),并将该类添加到该部分的<li>标记。

+0

这是UI的基础。 – DucDigital 2010-01-12 03:12:19

1

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; ; 
    } 
} 
0

的最佳方式 - 创建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> 
     }