我使用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}));
答案 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”]中放入你的命名空间。
此致 达里尔