Как добавить пространство имен к пользовательскому расширению маршрута
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.
С уважением,
Дэрил