Как добавить пространство имен к пользовательскому расширению маршрута

Im, используя route.add вместо route.maproute(который имеет args namespace) потому что я расширил класс маршрута. Мне нужно добавить пространство имен на маршрутах, потому что одна из моих областей имеет одно и то же имя контроллера в пределах сайта. Моя проблема в том, что я не знаю, где разместить пространство имен.


public class CultureRoute : Route
    {
     public CultureRoute(string url, object defaults, object constraints, RouteValueDictionary dataTokens)
            : base(url, new RouteValueDictionary(constraints), dataTokens, new MvcRouteHandler())
        {
        }
}

Global.asax



            routes.Add("Default", new CultureRoute(
                                      "{controller}/{action}/{id}",
                                      new {controller = "Home", action = "Index", id = UrlParameter.Optional}));


Ответы

Ответ 1



 var dataTokens = new RouteValueDictionary();
            var ns = new string[] {"MyProject.Controllers"};
            dataTokens["Namespaces"] = ns;


            routes.Add("Default", new CultureRoute(
                                      "{controller}/{action}/{id}",
                                      new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                                      null /*constraints*/,
                                      dataTokens
                                      ));


Ответ 2

EDIT: (ранее был создан собственный маршрут, но это не было необходимо). Это должно сделать трюк. По крайней мере, это происходит в MVC 4 и, скорее всего, MVC 3

Route defRoute = new CultureRoute ("{controller}/{action}/{id}",
            new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
            new SomeRouteHandler());
if( defRoute.DataTokens == null )
      defRoute.DataTokens = new RouteValueDictionary();
defRoute.DataTokens.Add("Namespaces", new string[] { "MVCApp.WebUI.Controllers" });
        routes.Add(defRoute);

Ответ 3

Для тех, кто искал решение для этого:

Сначала вам нужен конструктор, который принимает аргумент DataTokens и передает его конструктору Route.

Например, я использовал класс DomainRoute, который я получил в Интернете, у которого не было дополнительных аргументов, необходимых для перехода в домен. Поэтому я просто реализовал конструктор, похожий на базовый маршрут конструктор:

public DomainRoute(string domain, string url, object defaults, object constraints, object dataTokens)
              : base(url, new RouteValueDictionary(defaults), new RouteValueDictionary(constraints),new RouteValueDictionary(dataTokens),new MvcRouteHandler())
{
              Domain = domain;
}

Затем, если вы переопределили метод GetRouteData, вы должны вернуть DataTokens в возвращаемое значение RouteData. Чтобы понять это, мне пришлось посмотреть в исходном коде Route.cs(СПАСИБО ВАС JAVA2S).

RouteData data = new RouteData(...);
RouteValueDictionary dataTokens = DataTokens;
if (this.DataTokens != null) {
   RouteValueDictionary rdDataTokens = rd.DataTokens;
   foreach (var token in dataTokens)
      rdDataTokens.Add (token.Key, token.Value);
   }
}
return data;

Теперь просто помещаем ваши пространства имен в dataTokens [ "Пространства имен" ] согласно сообщению Fleents.

С уважением, Дэрил