Страница Wikipedia на E.164 должна сказать Вам все, что необходимо знать.
Я думаю, дело в том, как области используют словарь DataTokens для хранения информации области / пространства имен. Поскольку вы унаследованы от RouteBase, вам, вероятно, потребуется реализовать интерфейс IRouteWithArea , так как у вас нет токенов данных, которые есть у Route.
Помощник ActionLink, кажется, косвенно вызывает это, следовательно, необходимость в этом новый интерфейс:
public static string GetAreaName(RouteBase route)
{
IRouteWithArea area = route as IRouteWithArea;
if (area != null)
{
return area.Area;
}
Route route2 = route as Route;
if ((route2 != null) && (route2.DataTokens != null))
{
return (route2.DataTokens["area"] as string);
}
return null;
}
[Изменить - 12 ноября 2009 г.] Я считаю, что следующее поможет решить проблему, поскольку декоратор, похоже, в конечном итоге оборачивает маршрут более одного раза:
Дополнительное свойство декоратора:
public RouteBase InnerRoute
{
get
{
return _route;
}
}
Реализация интерфейса:
public string Area
{
get
{
RouteBase r = _route;
while (r is RouteDecorator)
r = ((RouteDecorator) r).InnerRoute;
string s = GetAreaToken(r);
if (s!= null) return s;
return null;
}
}
private string GetAreaToken(RouteBase r)
{
var route = r as Route;
if (route != null && route.DataTokens !=null && route.DataTokens.ContainsKey("area"))
{
return (route.DataTokens["area"] as string);
}
return null;
}
}
Что произойдет, если украсить класс Route вместо RouteBase?
Подумайте о чем-то вроде этого:
public class RouteDecorator: Route
{
readonly Route _route;
public RouteDecorator(Route route)
{
_route = route;
}
public override RouteData GetRouteData(HttpContextBase context)
{
return _route.GetRouteData(context);
}
public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary values)
{
return _route.GetVirtualPath(context, values);
}
}
Я также рекомендую проверить System.Web.Routing.dll с Reflector, это может дать вам представление о том, что происходит.
А также, что произойдет, если вы сделаете это:
var routes = RouteTable.Routes.ToList();
RouteTable.Routes.Clear();
//or, alternatively, if the above doesn't work:
//RouteTable.Routes = new RouteCollection();
foreach (var r in routes)
{
RouteTable.Routes.Add(new RouteDecorator(r));
}
Я очень надеюсь, что это поможет.