HtmlHelper Получение названия маршрута - PullRequest
4 голосов
/ 01 апреля 2010

Я создал помощник html, который добавляет свойство класса css к элементу li, если пользователь находится на текущей странице. Помощник выглядит так:

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

Кстати, я использую MVC 1.0.

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Основываясь на предложениях Леви, я реализовал следующую реализацию, которая вполне мне подходит:

public static bool IsCurrentRoute(ControllerContext controllerContext, string routeName)
{
    return controllerContext.RouteData.Route == System.Web.Routing.RouteTable.Routes[routeName];
}
  • Из ваших View вы можете вызывать этот статический метод с помощью @ ViewContext
  • Из вашего ActionFilter вы можете вызвать его с помощью filterContext (например, ActionExecutedContext)
  • Если у вас есть доступ только к объекту HtmlHelper, вы можете вызвать его с помощью HtmlHelper.ViewContext
2 голосов
/ 02 апреля 2010

Названия не являются атрибутами маршрутов напрямую; это просто способ для коллекции отображать строки на маршруты. Таким образом, вы не можете получить название маршрута из текущего маршрута.

Но вы можете сравнивать сами маршруты, а не использовать имя. Поскольку у вас есть текущий экземпляр RouteBase (вы можете получить его через HtmlHelper.ViewContext.RouteData.Route) и RouteCollection (через HtmlHelper.RouteCollection), вы можете использовать RouteCollection.Item для получения RouteBase, соответствующего название целевого маршрута. Сравните возвращенный экземпляр RouteBase с текущим экземпляром RouteBase.

...