C# MVC-给定一个路由名称,我可以得到默认的操作名称和控制器名称吗?
给定路由名称,我可以获得默认的操作名称和控制器名称吗C# MVC-给定一个路由名称,我可以得到默认的操作名称和控制器名称吗?,c#,asp.net,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net,Asp.net Mvc,Asp.net Mvc Routing,给定路由名称,我可以获得默认的操作名称和控制器名称吗 routes.MapRoute( name: "MonthlyCalendar", url: "FMB/Calendar/{jamaatName}/{year}/{month}", defaults: new { controller = "FMB", action = "MonthlyCalendar", jamaatName = UrlParameter.Optional,year
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}
);
不,当然,您不能仅从路由名称获取控制器和操作名称。路由映射可能如下所示:{controller}/{action}/{id}
。如果您只有一个路由名称,那么这是唯一可以得到的
另一方面,如果您有完整的url,例如http://example.com/Home/Index
那么这是一个完全不同的故事。现在,您可以从RoutedData获取控制器=主页和操作=索引
更新: 似乎您正试图从给定路由名称的路由配置中提取控制器和操作的默认值。这可以通过在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"];
}
您可能应该首先检查以确保它存在,以避免出现空异常。否,当然,您不能仅从路由名称获取控制器和操作名称。路由映射可能如下所示:{controller}/{action}/{id}
。如果您只有一个路由名称,那么这是唯一可以得到的
另一方面,如果您有完整的url,例如http://example.com/Home/Index
那么这是一个完全不同的故事。现在,您可以从RoutedData获取控制器=主页和操作=索引
更新: 似乎您正试图从给定路由名称的路由配置中提取控制器和操作的默认值。这可以通过在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"];
}
您可能应该首先检查它是否存在,以避免出现空异常。您可以查看
System.Web.Routing.RouteTable.Routes
。它包含系统中的所有路由。但是如果未指定操作和控制器,则找不到默认值操作和控制器您可以查看System.Web.Routing.RouteTable.Routes
。它包含系统中的所有路由。但是您找不到默认值操作和控制器,如果未指定它们您可以通过读取ControllerContext.RouteData
来获取为您的请求服务的路由数据<代码>路由数据对象具有值
,而值又具有键
,您可以检查并应用于值以获取路由的所有片段
通常,您可以循环通过RouteCollection
(这取决于您所在的上下文,例如ViewContext或使用HtmlHelper对象),提取每个项并将其强制转换为Route
对象。在该调用之后,Route.getRoutedData(您的HttpContextBasehere)
返回RoutedData
或null。如果它返回一个对象,Route
满足您的请求,并检查默认值
属性
例如,假设您正在构建一个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
通过阅读
ControllerContext.RouteData
,您可以获得为您的请求服务的RouteData<代码>路由数据对象具有值
,而值又具有键
,您可以检查并应用于值以获取路由的所有片段
通常,您可以循环通过RouteCollection
(这取决于您所在的上下文,例如ViewContext或使用HtmlHelper对象),提取每个项并将其强制转换为Route
对象。在该调用之后,Route.getRoutedData(您的HttpContextBasehere)
返回RoutedData
或null。如果它返回一个对象,Route
满足您的请求,并检查默认值
属性
例如,假设您正在构建一个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
我创建了这个扩展方法,将“活动”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);
}
完全扩展方法:
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);
}
public static MvcHtmlString MenuRouteLink(此HtmlHelper HtmlHelper、string linkText、string routeName、RouteValueDictionary routeValues、,
I词典(赠品)
{
string currentAction=htmlHelper.ViewContext.RoutedData.GetRequiredString(“操作”);
string currentController=htmlHelper.ViewContext.RoutedData.GetRequiredString(“控制器”);
var route=RouteTable。路由[routeName]作为路由;
if(路由!=null)
{
routeValues=routeValues??新建RouteValueDictionary();
string routeAction=(routeValues[“action”]作为字符串??route.Defaults[“action”]作为字符串)??string.Empty;
string routeController=(routeValue[“controller”]作为字符串??route.Defaults[“controller”]作为字符串)??string.Empty;
if(routeAction.Equals(currentAction,StringComparison.OrdinalIgnoreCase)和&routeController.Equals(currentController,StringComparison.OrdinalIgnoreCase))
{
htmlAttributes=htmlAttributes??新字典();
var currentCssClass=htmlAttributes[“class”]作为字符串??string.Empty;
htmlAttributes[“class”]=string.Concat(currentCssClass,currentCssClass.Length>0?“:string.Empty,“active”);
}
}
返回htmlHelper.RouteLink(linkText、routeName、RouteValue、htmlAttributes);
}
我创建了这个扩展方法,将“活动”css类添加到路由链接中。此方法获取默认操作和控件