从 routeName 获取控制器和动作
Get controller and action from routeName
我正在尝试构建一个可以突出显示当前查看的导航项的扩展方法。
我所有的 link 都是使用标准 Url.RouteUrl("RouteName")
生成的 - 这会为控制器和操作生成完全合格的 link。
现在我需要从这个 url 中提取控制器和动作。 ASP.NET MVC5 是否提供任何功能来从路由名称中获取该信息?例如。通过使用提供的 routeName
询问一个方法,它将为我提供 routeName
将指向的控制器和操作的对象?
我在 Google 上找到了一些代码,似乎工作正常。即将微调此代码段:
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);
}
我正在尝试构建一个可以突出显示当前查看的导航项的扩展方法。
我所有的 link 都是使用标准 Url.RouteUrl("RouteName")
生成的 - 这会为控制器和操作生成完全合格的 link。
现在我需要从这个 url 中提取控制器和动作。 ASP.NET MVC5 是否提供任何功能来从路由名称中获取该信息?例如。通过使用提供的 routeName
询问一个方法,它将为我提供 routeName
将指向的控制器和操作的对象?
我在 Google 上找到了一些代码,似乎工作正常。即将微调此代码段:
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);
}