2015-02-08 65 views
2

我有我需要知道區域,控制器和動作的全局屬性。由於路由(內部區域註冊和屬性路由),我無法使用RawUrl。我遵循了以下兩種方法,但在這兩種情況下,我的區域都回歸爲空。當我使用路線,然後我得到區域名稱就好了。爲什麼當我做redirecttoaction或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" 
       } 
      ); 


     } 
    } 

回答

3

當一個區域被註冊時,MapRoute使用的方法是向每個路由添加一個dataContextToken。您可以查看源代碼here,你會看到一個方法像下面,你會發現一個行添加數據令牌:

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)); 
} 
+0

感謝您的詳細信息。我將在早上第一件事情檢查它。 – 2015-02-08 18:07:10

相關問題