2013-03-22 204 views
1

我的项目结构:Mvc区域路由?

Controller 
    AdminController 
    HomeController 

区加入后,我的项目structureI增加了一个管理区域项目,

Areas 
    Admin 
     Controller 
      SomeController 
Controller 
    AdminController 
    HomeController 

然后各个环节都坏了。例如

@Html.ActionLink(
    "go to some action", 
    "SomeAction", 
    "Admin", 
    new { area = "" }, 
    null) 

当我写上面的链接,它的路线我www.myDomain.com/Admin/SomeAction,但是这方面的行动,我想路由到AdminController行动。

我该怎么做?我应该改变区域还是控制器名称?

更新

上面的链接输出:

domain/Admin/SomeAction 
// I expect that is AdminController/SomeAction 
// but not. There is SomeAction in my admin controller 
// I get this error "The resource cannot be found." 
// because it looks my expected, but it works unexpected 
// it tries to call AdminArea/SomeController/SomeAction 

更新2

例如:

@Html.ActionLink(
    "go to some action", 
    "SomeAnotherAction", 
    "Admin", 
    new { area = "" }, 
    null) 

上面的链接我没有得到任何电子邮件恐怖,因为我在我的地区有一些其他行为。

区registeration

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Admin_default", 
     "Admin/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
    ); 
} 

谢谢...

+0

您必须将其路由到具有SomeAction的控制器。现在你正在从AdminController调用SomeAction ActionResult。你想从AreaController调用SomeAction。或者我错过了什么? – William 2013-03-22 13:35:17

+0

已编辑。我也很难解释。总结,我想调用项目主控制器的操作,但它调用区域控制器的操作。链接看起来是正确的,但它的工作不正确。 – 2013-03-22 13:45:46

回答

1

既然您已经注册地区第一,他们正在采取优先。有没有简单的方法解决这个问题。最好的解决办法是将网站主要部分的AccountController重命名为其他内容以避免冲突。

另一种可能性是约束控制器在您的区域路线报名:

context.MapRoute(
    "Admin_default", 
    "Admin/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Some|SomeOther" } 
); 

现在只要求到/Admin/Some/{action}/Admin/SomeOther/{action}将被路由到该地区,这意味着/Admin/SomeAction将受到全球路由定义拦截和路由到您的AdminController

+0

第二种方式正在工作,但它不是优雅的方式,因为我应该所有的区域控制器,对吧?如果是的话,我会改变我的管理员控制器名称...感谢您的建议... – 2013-03-22 14:10:50