2010-04-01 109 views
2

如果用戶在當前頁面上,我已經創建了一個html助手,它將一個css類屬性添加到li項目中。助手看起來是這樣的:HtmlHelper獲取路由名稱

public static string MenuItem(this HtmlHelper helper, string linkText, 
    string actionName, string controllerName, object routeValues, object htmlAttributes) 
{ 
    string currentControllerName = 
    (string)helper.ViewContext.RouteData.Values["controller"]; 
    string currentActionName = 
    (string)helper.ViewContext.RouteData.Values["action"]; 

    var builder = new TagBuilder("li"); 

    // Add selected class 
    if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && 
      currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase)) 
     builder.AddCssClass("active"); 

    // Add link 
    builder.InnerHtml = helper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes); 

    // Render Tag Builder 
    return builder.ToString(TagRenderMode.Normal); 
} 

我想擴大這個類,所以我可以傳遞路線名助手,如果用戶是路線上,然後它添加CSS類鋰項目。但是我很難找到用戶所在的路線。這可能嗎?我到目前爲止的代碼是:

public static string MenuItem(this HtmlHelper helper, string linkText, string routeName, object routeValues, object htmlAttributes) 
{ 
    string currentControllerName = 
     (string)helper.ViewContext.RouteData.Values["controller"]; 
    string currentActionName = 
     (string)helper.ViewContext.RouteData.Values["action"]; 

    var builder = new TagBuilder("li"); 

    // Add selected class 
    // Some code for here 
    // if (routeName == currentRoute) AddCssClass; 

    // Add link 
    builder.InnerHtml = helper.RouteLink(linkText, routeName, routeValues, htmlAttributes); 

    // Render Tag Builder 
    return builder.ToString(TagRenderMode.Normal); 
} 

順便說一句我正在使用MVC 1.0。

謝謝

回答

2

名稱不是直接路由的屬性;它們只是集合將字符串映射到路由的一種方式。所以你不能從當前路線獲取路線名稱。

但你可以比較自己的路線,而不是使用名稱。由於您具有當前的RouteBase實例(可以通過HtmlHelper.ViewContext.RouteData.Route獲取它)和RouteCollection(通過HtmlHelper.RouteCollection),因此可以使用RouteCollection.Item獲取與目標路由名稱對應的RouteBase。比較返回的RouteBase實例和當前的RouteBase實例。

1

基於李維斯建議我做了下面的實現,它工作得很好對我來說:

public static bool IsCurrentRoute(ControllerContext controllerContext, string routeName) 
{ 
    return controllerContext.RouteData.Route == System.Web.Routing.RouteTable.Routes[routeName]; 
} 
  • 從您的視圖的,你可以調用這個靜態方法與@ViewContext
  • 從你ActionFilter的你可以用filterContext調用它(例如ActionExecutedContext)
  • 當你只有訪問HtmlHelper對象時,可以使用HtmlHelper.ViewContext調用它
相關問題