1

给定路由名称,我可以获得默认操作名称和控制器名称吗?

routes.MapRoute(
      name: "MonthlyCalendar",
      url: "FMB/Calendar/{jamaatName}/{year}/{month}",
      defaults: new { controller = "FMB", action = "MonthlyCalendar", 
         jamaatName = UrlParameter.Optional,year = UrlParameter.Optional,
         month=UrlParameter.Optional}
);
4

4 回答 4

5

不,当然,您不能仅从路由名称中获取控制器和操作名称。路由映射可能如下所示:{controller}/{action}/{id}. 如果您只有一个路线名称,那是您唯一可以获得的东西。

另一方面,如果你有一个完整的网址,http://example.com/Home/Index那么这是一个完全不同的故事。现在您可以从 RouteData 中获取 controller=Home 和 action=Index。


更新:

给定路由名称,您似乎正在尝试从路由配置中提取控制器和操作的默认值。这可以通过在 DataTokens 属性中注册时存储路由名称来轻松完成:

RouteTable.Routes.MapRoute(
    "foo",
    "{controller}/{action}", 
    new { controller = "Home", action = "Index" }
).DataTokens["__RouteName"] = "foo";

接着:

var route = RouteTable.Routes.OfType<Route>().FirstOrDefault(x => 
    x.DataTokens.ContainsKey("__RouteName") && 
    (string)x.DataTokens["__RouteName"] == "foo"
);
if (route != null)
{
    var defaultController = route.Defaults["controller"];
    var defaultAction = route.Defaults["action"];
}

之所以需要将路由名称存储在 DataTokens 中,是因为此信息在 Route 实例中不可用。


更新:

在某些时候,MS 添加了一个索引器来RouteCollection按名称查找,因此不再需要上述内容:

 ((System.Web.Routing.Route)Url.RouteCollection["MyRouteName"]).Defaults

您可能应该首先检查以确保它存在以避免空异常。

于 2013-06-07T11:24:12.080 回答
3

我创建了这个扩展方法,将“活动”css 类添加到路由链接。如果 RouteValueDictionary 中未提供操作和控制器,则此方法根据路由名称从路由中获取默认操作和控制器。

您可以从 中的路由获取默认操作RouteTable,但是您需要将返回值转换为Route而不是RouteBase.

例子:

var action = (RouteTable.Routes["Default"] as Route).Defaults["action"] as string;

完全扩展方法:

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

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

        if (routeAction.Equals(currentAction, StringComparison.OrdinalIgnoreCase) && routeController.Equals(currentController, StringComparison.OrdinalIgnoreCase))
        {
            htmlAttributes = htmlAttributes ?? new Dictionary<string, object>();
            var currentCssClass = htmlAttributes["class"] as string ?? string.Empty;
            htmlAttributes["class"] = string.Concat(currentCssClass, currentCssClass.Length > 0 ? " " : string.Empty, "active");
        }
    }

    return htmlHelper.RouteLink(linkText, routeName, routeValues, htmlAttributes);
}
于 2015-02-05T04:22:44.040 回答
1

您可以通过阅读来获取应该为您的请求提供服务的 RouteData ControllerContext.RouteDataRouteData对象具有ValuesKeys,您可以检查并应用到 Values 以获取路线的所有片段。

通常,您可以循环遍历RouteCollection(这取决于您所在的上下文,例如 ViewContext,或使用 HtmlHelper 对象)并提取每个项目并将其转换为Route对象。之后调用Route.GetRouteData(YourHttpContextBaseHere)which returnRouteData或 null。如果它返回一个对象,该对象会满足Route您的请求并检查Defaults属性。

例如,假设您正在构建一个 HTML 帮助程序并且您可以访问 HtmlHelper 对象。以下代码向您展示了您可以做什么:

var defaults = (RouteValueDictionary) null;
foreach (var routeBase in html.RouteCollection)
{
    var route = (Route) routeBase;
    var routeData = route.GetRouteData(html.ViewContext.HttpContext);

    if (routeData != null) 
    {
        defaults = route.Defaults;
        break;
    }
}

// Do something with defaults object
于 2013-06-07T11:25:17.610 回答
0

你可以调查一下System.Web.Routing.RouteTable.Routes。它包含系统中的所有路由。但是,如果未指定默认操作和控制器,您将找不到它们

于 2013-06-07T11:25:07.570 回答