首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在过滤器属性中获取区域、控制器和动作名称

在过滤器属性中获取区域、控制器和动作名称
EN

Stack Overflow用户
提问于 2015-02-08 07:17:54
回答 1查看 5.2K关注 0票数 4

我有全局属性,需要知道区域、控制器和行动。由于路由(区域内注册和属性路由),我不能使用RawUrl。我遵循了以下两种方法,但在这两种情况下,我的区域返回为null。当我使用一条路线时,我就可以得到区域名称。为什么当我进行重定向操作或url.action或手动键入url时,区域为空?我们正在使用MVC 5.0。

1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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),那么我就可以得到区域名称了。

代码语言:javascript
复制
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"
                }
            );


        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-08 14:11:25

当注册一个区域时,所使用的MapRoute方法是向每个路由添加一个dataContextToken。您可以检查源代码这里,您将看到如下所示的方法,您将注意到添加数据令牌的一行:

代码语言:javascript
复制
public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
    ...   
    route.DataTokens[RouteDataTokenKeys.Area] = AreaName;
    ...
    return route;
}

因此,在筛选器中,只需要使用密钥"area"来获取数据令牌,而不是路由值。例如,下面的过滤器将添加一个标题--在路由中找到的区域、控制器和操作

代码语言:javascript
复制
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));
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28391576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档