Почему декораторы маршрута повреждают маршрутизацию в ASP.NET MVC 2?

Страница Wikipedia на E.164 должна сказать Вам все, что необходимо знать.

6
задан Daniel Crenna 6 November 2009 в 03:37
поделиться

2 ответа

Я думаю, дело в том, как области используют словарь 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;
        }
    }
5
ответ дан 17 December 2019 в 04:48
поделиться

Что произойдет, если украсить класс 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));
}

Я очень надеюсь, что это поможет.

0
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: