Как добавить пространство имен в пользовательское расширение маршрута - PullRequest
13 голосов
/ 05 ноября 2010

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


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}));

Ответы [ 3 ]

17 голосов
/ 05 ноября 2010

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
));

3 голосов
/ 30 апреля 2012

РЕДАКТИРОВАТЬ: (Ранее создал пользовательский маршрут, но это не было необходимо).Это должно сделать свое дело.По крайней мере, в 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);
1 голос
/ 15 августа 2011

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

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

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

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 , вы must возвращает 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 ["Namespaces"] согласно сообщению Fleents.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...