2015-04-28 157 views
0

我想構建一個擴展方法,它可以突出顯示當前正在查看的導航項目。從路由名稱獲取控制器和操作

我的所有鏈接都是使用標準Url.RouteUrl("RouteName")生成的 - 這會爲控制器和操作生成完全限定的鏈接。

現在我需要從這個URL中提取控制器和動作。 ASP.NET MVC5是否提供了從路由名稱中獲取信息的功能?例如。通過詢問使用提供的routeName的方法,這將使我獲得控制器和routeName將指向的操作的對象?

回答

0

我在Google上發現了一些代碼,這似乎工作得很好。關於微調這個片段:

public static MvcHtmlString MenuRouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, RouteValueDictionary routeValues = null, IDictionary<string, object> htmlAttributes = null) 
{ 
    var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action"); 
    var currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller"); 
    if (htmlAttributes == null) htmlAttributes = new Dictionary<string, object>(); 

    var route = RouteTable.Routes[routeName] as Route; 
    if (route != null) 
    { 
     routeValues = routeValues ?? new RouteValueDictionary(); 
     var routeAction = (routeValues["action"] as string ?? route.Defaults["action"] as string) ?? String.Empty; 
     var routeController = (routeValues["controller"] as string ?? route.Defaults["controller"] as string) ?? String.Empty; 

     if (routeAction.Equals(currentAction, StringComparison.OrdinalIgnoreCase) && routeController.Equals(currentController, StringComparison.OrdinalIgnoreCase)) 
     { 
      var currentCssClass = htmlAttributes.ContainsKey("class") ? htmlAttributes["class"] as string : String.Empty; 
      htmlAttributes["class"] = String.Concat(currentCssClass, !String.IsNullOrEmpty(currentCssClass) ? " " : String.Empty, "selected"); 
     } 
    } 

    return htmlHelper.RouteLink(linkText, routeName, routeValues, htmlAttributes); 
} 
相關問題