从routeName获取控制器和操作

时间:2015-04-28 18:50:57

标签: c# asp.net-mvc-5 asp.net-mvc-routing

我正在尝试构建一个可以突出显示当前查看的导航项的扩展方法。

我的所有链接都是使用标准Url.RouteUrl("RouteName")生成的 - 这会为控制器和操作生成一个完全限定的链接。

现在我需要从这个url中提取控制器和动作。 ASP.NET MVC5是否提供了从路由名称中获取该信息的任何功能?例如。通过询问一个提供routeName的方法来获取控制器的对象和routeName将指向的操作?

1 个答案:

答案 0 :(得分:0)

我在谷歌上找到了一些代码,似乎工作正常。即将微调这个片段:

public static MvcHtmlString MenuRouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, RouteValueDictionary routeValues = null, IDictionary<string, object> htmlAttributes = null)
{
    var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action");
    var currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller");
    if (htmlAttributes == null) htmlAttributes = new Dictionary<string, object>();

    var route = RouteTable.Routes[routeName] as Route;
    if (route != null)
    {
        routeValues = routeValues ?? new RouteValueDictionary();
        var routeAction = (routeValues["action"] as string ?? route.Defaults["action"] as string) ?? String.Empty;
        var routeController = (routeValues["controller"] as string ?? route.Defaults["controller"] as string) ?? String.Empty;

        if (routeAction.Equals(currentAction, StringComparison.OrdinalIgnoreCase) && routeController.Equals(currentController, StringComparison.OrdinalIgnoreCase))
        {
            var currentCssClass = htmlAttributes.ContainsKey("class") ? htmlAttributes["class"] as string : String.Empty;
            htmlAttributes["class"] = String.Concat(currentCssClass, !String.IsNullOrEmpty(currentCssClass) ? " " : String.Empty, "selected");
        }
    }

    return htmlHelper.RouteLink(linkText, routeName, routeValues, htmlAttributes);
}