如何将命名空间添加到自定义路由扩展

时间:2010-11-05 05:57:44

标签: asp.net-mvc model-view-controller

我使用routes.add而不是routes.maproute(它有一个命名空间arg) 因为我扩展了路线类。 我需要在路由上添加命名空间,因为我的一个区域具有相同的控制器名称 在网站内。 我的问题是我不知道在哪里放置命名空间..


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 个答案:

答案 0 :(得分:17)


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

答案 1 :(得分:3)

编辑:(以前创建了自定义路线,但这不是必需的)。这应该可以解决问题。至少它在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);

答案 2 :(得分:1)

对于那些正在寻找解决方案的人:

首先需要一个接受DataTokens参数的构造函数,并将其传递给Route构造函数。

例如,我使用的是我在线选择的DomainRoute类,它没有传递给Domain所需的额外参数。所以我只是实现了一个类似于基本路由constructor的构造函数:

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方法,必须返回RouteData返回值中的DataTokens。为了解决这个问题,我不得不查看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;

现在根据Fleents帖子简单地在dataTokens [“Namespaces”]中放入你的命名空间。

此致 达里尔