HtmlHelper获取路由名称

时间:2010-04-01 18:23:09

标签: asp.net-mvc routing routes html-helper

我创建了一个html帮助程序,如果用户在当前页面上,则会向li项添加css类属性。助手看起来像这样:

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。

由于

2 个答案:

答案 0 :(得分:2)

名称不是直接路由的属性;它们只是集合将字符串映射到路径的一种方式。因此,您无法从当前路线获取路线名称。

但是可以比较路线本身而不是使用名称。由于您具有当前的RouteBase实例(可以通过HtmlHelper.ViewContext.RouteData.Route获取)和RouteCollection(通过HtmlHelper.RouteCollection),因此可以使用RouteCollection.Item来获取与目标路由名称对应的RouteBase。将返回的RouteBase实例与当前RouteBase实例进行比较。

答案 1 :(得分:2)

根据Levi的建议,我做了以下实现,这对我很有用:

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调用它