2010-01-11 175 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> 
     }