我创建了一个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。
由于
答案 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];
}