1

Что я пытаюсь сделать, чтобы получить имя контроллера и имя действия в HttpModule.route.GetRouteData (httpContext) .Values ​​["action"] имеет значение null для атрибутивной маршрутизации

В OnBeginRequest моего HTTP модуля, у меня есть следующий код:

foreach (var route in RouteTable.Routes) 
{ 
    if (route.GetRouteData(httpContext) != null) 
    { 
     Console.WriteLine(string.Format(CultureInfo.InvariantCulture, 
      "Route info ====== {0}, {1} ======", 
      route.GetRouteData(httpContext).Values["controller"], 
      route.GetRouteData(httpContext).Values["action"])); 
    } 
} 

Если маршрут зарегистрировать с помощью обычной маршрутизации, как это:

routes.MapRoute("BlogDetails", "blog/{blogId}", new { controller = "Blog", action = "Details" }); 

И когда я иду: ~/блог/1 я мог видеть выход

"Route info ====== Blog, Details ======" 

Но если это регистр с помощью:

routes.MapMvcAttributeRoutes(); 

И в контроллере у меня есть:

[RouteArea("blog", AreaPrefix = "blog")] 
[Route("{action}")] 

О действии у меня есть: [Route("{blogId}", Name="blogDetailRoute")]

И когда я иду: ~/блог/1 Я вижу только выход

"Route info ====== Blog, ======" 

В данных маршрута отсутствует имя действия.

Что-то другое в маршрутизации атрибутов? Где можно найти имя действия?

Спасибо за помощь!

ответ

1

Маршруты маршрутизации атрибутов хранятся в вложенном IEnumerable<RouteData> с именем MS_DirectRouteMatches.

var routeData = routes.GetRouteData(httpContext); 
if (routeData != null) 
{ 
    if (routeData.Values.ContainsKey("MS_DirectRouteMatches")) 
    { 
      routeData = ((IEnumerable<RouteData>)routeData.Values["MS_DirectRouteMatches"]).First(); 
    } 
} 

Этот пример показывает, как мы берем обычные данные маршрута, если он совпадает с текущим контекстом, и заменить его атрибутом маршрутизации данных, если это происходит на существование.

+0

Отлично, я мог бы найти их в MS_DirectRouteMatches, спасибо! – Wei

Смежные вопросы