asp.net-mvc - 在过滤器属性中获取区域、 Controller 和 Action 名称

标签 asp.net-mvc asp.net-mvc-routing

我有全局属性,我需要知道区域、 Controller 和 Action 。由于路由(区域内注册和属性路由),我无法使用 RawUrl。我遵循了以下两种方法,但在这两种情况下,我的区域都返回空值。当我使用路线时,我得到的区域名称就好了。当我执行重定向操作或 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"
                }
            );


        }
    }

最佳答案

当一个区域被注册时,使用的 MapRoute 方法会向每条路线添加一个 dataContextToken。可以查看源码here ,您将看到如下所示的方法,并且您会注意到添加数据标记的一行:

public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces)
{
    ...   
    route.DataTokens[RouteDataTokenKeys.Area] = AreaName;
    ...
    return route;
}

因此,在您的过滤器中,您只需要使用 key "area" 获取数据 token 。而不是路由值。例如,以下过滤器将在路由中找到的区域、 Controller 和操作添加一个 header
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));
}

关于asp.net-mvc - 在过滤器属性中获取区域、 Controller 和 Action 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391576/

相关文章:

asp.net-mvc - ASP.Net MVC url 设计和结构指南

c# - 没有 html 标记的 ASP.NET MVC 3/4 ValidationMessageFor

JavaScript if else 在全日历上设置事件颜色的条件不起作用

c# - 在断开连接时检测用户信号器

c# - 在 ASP.net MVC 中显示没有 Controller 或操作的文件夹中的 View

c# - 将多个参数传递给操作

asp.net-mvc - 如何将查询字符串映射到 MVC 中的操作方法参数?

c# - 为什么我不能让 LINQ 在我的 .cshtml 文件中工作?

asp.net-mvc - Visual Web Developer 2010 Express 中未命中断点

asp.net-mvc-2 - .NET MVC2 - 我的区域 url 没有注册?