不,当然,您不能仅从路由名称中获取控制器和操作名称。路由映射可能如下所示:{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
您可能应该首先检查以确保它存在以避免空异常。