2010-04-01 6 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 для элемента LI. Однако мне трудно найти маршрут, в котором находится пользователь. Это возможно? Код, который у меня есть до сих пор:

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

BTW Я использую MVC 1.0.

Thanks

ответ

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
Смежные вопросы