MVC 2 AreaRegistration路线顺序

Jas*_*son 12 asp.net-mvc routes asp.net-mvc-routing .net-3.5

我注意到在MVC 2 Preview 2中,AreaRegistration正在以任意顺序加载每个区域的路由.有没有一个好方法让一个先于另一个?

例如,我有两个区域 - "站点"和"管理员".两者都有一个"博客"控制器.

我想要以下内容:

/admin/ --> go to Admin's Blog controller
/       --> go to Site's Blog controller. 
Run Code Online (Sandbox Code Playgroud)

问题是它首先加载了站点的路由,所以它匹配{controller}/{action}/{id}而不是admin/{controller}/{action}/{id}当我转到URL"/ admin /"时.然后我得到404,因为"站点"区域中没有管理员控制器.

这两个区域都默认为"博客"控制器.我意识到我可以简单地把它site/{controller}/...作为网址,但如果可能的话,我宁愿把它放在根端.我还尝试在全局RegisterRoutes函数中保留默认路由,但是,它不会发送到"站点"区域.

提前致谢!

Eil*_*lon 30

除了Haacked所说的,很有可能订购区域注册(以及他们的路线).您所要做的就是手动注册每个区域,无论您想要什么顺序.它不像调用RegisterAllAreas()那样流畅,但它绝对可行.

protected void Application_Start() {
    var area1reg = new Area1AreaRegistration();
    var area1context = new AreaRegistrationContext(area1reg.AreaName, RouteTable.Routes);
    area1reg.RegisterArea(area1context);

    var area2reg = new Area2AreaRegistration();
    var area2context = new AreaRegistrationContext(area2reg.AreaName, RouteTable.Routes);
    area2reg.RegisterArea(area2context);

    var area3reg = new Area3AreaRegistration();
    var area3context = new AreaRegistrationContext(area3reg.AreaName, RouteTable.Routes);
    area3reg.RegisterArea(area3context);
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是获取RegisterAllAreas()的代码,将其复制到您自己的应用程序中,并构建您自己的机制来确定订单.如果您想要内置方法所具有的所有花哨的缓存逻辑,那么复制相当多的代码,但您的应用可能甚至不需要.


Haa*_*ked 7

目前无法订购区域.但是,我认为尝试使每个区域尽可能独立于其他区域是有意义的,因此顺序无关紧要.

例如,不是使用默认的{controller}/{action}/{id}路由,而是将其替换为每个控制器的特定路由.或者为该默认路由添加约束.

我们正在考虑允许订购的选项,但我们不希望过度复杂化该功能.