我有全局属性,需要知道区域、控制器和行动。由于路由(区域内注册和属性路由),我不能使用RawUrl。我遵循了以下两种方法,但在这两种情况下,我的区域返回为null。当我使用一条路线时,我就可以得到区域名称。为什么当我进行重定向操作或url.action或手动键入url时,区域为空?我们正在使用MVC 5.0。
1:
var routingValues = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current)).Values;
var currentArea = (string) routingValues["area"] ?? string.Empty;
var currentController = (string) routingValues["controller"] ?? string.Empty;
var currentAction = (string) routingValues["action"] ?? string.Empty;2:
var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler;
var area = handler.RequestContext.RouteData.Values["area"];
var controller = handler.RequestContext.RouteData.Values["controller"];
var action = handler.RequestContext.RouteData.Values["action"];就像我前面说的,如果我使用一条路线(/TipHotLine),那么我就可以得到区域名称了。
public class AgencyAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Agency";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Agency_default",
"Agency/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"tiphotline",
"tiphotline",
new
{
controller = "tiphotline",
action = "Index",
Area = "Agency"
}
);
}
}发布于 2015-02-08 14:11:25
当注册一个区域时,所使用的MapRoute方法是向每个路由添加一个dataContextToken。您可以检查源代码这里,您将看到如下所示的方法,您将注意到添加数据令牌的一行:
public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
...
route.DataTokens[RouteDataTokenKeys.Area] = AreaName;
...
return route;
}因此,在筛选器中,只需要使用密钥"area"来获取数据令牌,而不是路由值。例如,下面的过滤器将添加一个标题--在路由中找到的区域、控制器和操作
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var routingValues = filterContext.RouteData.Values;
var currentArea = filterContext.RouteData.DataTokens["area"] ?? string.Empty;
var currentController = (string)routingValues["controller"] ?? string.Empty;
var currentAction = (string)routingValues["action"] ?? string.Empty;
filterContext.HttpContext.Response.AddHeader("Routing info", string.Format("controller={0},action={1},area={2}", currentController, currentAction, currentArea));
}https://stackoverflow.com/questions/28391576
复制相似问题