MVC非区域路线问题(与区域一起)

时间:2011-09-26 10:37:29

标签: c# asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing

我应该如何配置以下非区域路由?

/富/ {控制器} / {行动} / {ID}
映射到命名空间myapp.foo中的控制器。

/ {控制器} / {行动} / {ID}
映射到命名空间myapp中的控制器。

我还有2个区域, bar baz ,它们已在registeraAllAreas注册。

我当前的设置

这是我目前的设置。当我使用url / Home / Index时,它会给出以下问题。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("myapp/elmah.axd/{*pathInfo}");

AreaRegistration.RegisterAllAreas();

routes.MapRoute(
    "foo", // Route name
    "foo/{controller}/{action}/{id}", // URL with parameters
    new { action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new string[] { "myapp.Controllers.foo" }
);

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new string[] { "myapp.Controllers" }
);
  

找到了多个与名为“Menu”的控制器匹配的类型。这个   如果为此请求提供服务的路由可能会发生   ('foo / {controller} / {action} / {id}')未指定名称空间   搜索与请求匹配的控制器。

     

“菜单”请求找到了以下匹配的控制器:   myapp.Controllers.MenuController
  myapp.Areas.bar.Controllers.MenuController
  myapp.Areas.baz.Controllers.MenuController

显然,我做错了。

更新

我使用时也会生成错误的地址:

<% using (Ajax.BeginForm("SaveSomething", "Home", ...

呈现<form target="/foo/Home/SaveSomething"

我猜测在同一区域的两条路线中无法可靠地使用{controller}。

更新2

当我把/ foo路由注册放在底部时似乎工作得更好 这提出了一个问题,什么被认为是/默认路线? (由于默认路线被建议放在最后。)

1 个答案:

答案 0 :(得分:2)

您有两个名称为MenuController的控制器,因此如果您不提供更多信息,MVC不知道要使用哪个控制器。在您的区域,您可能有一个名为<YourAreaName>AreaRegistration的文件。打开这些文件并更新RegisterArea方法,以便将请求路由到正确的控制器。

从您的错误消息中,似乎路线已映射到foo / {controller} / {action} / {id},但没有MenuController。我的猜测是你在foo下的页面上有一个动作链接。如果您没有指定链接的区域,则会生成错误的链接。

尝试使用ActionLink的默认路线:

@Html.ActionLink("Some text", "action", "controller", new { area = "" }, null)

如果您希望请求转到特定区域,请在通话中将其写下来。

更新:问题在于,当您编写Ajax.BeginForm("SaveSomething", "Home",...)之类的内容时,它会匹配第一条路线。你不能通过将该区域放在BeginForm语句中来解决这个问题,因为foo路由不是一个区域。您有两个选项,1:将foo部分移动到某个区域,2:将foo路径放在默认路径之后。如果你在foo路由之前放置默认路由,只要你在与默认路由(默认区域)相同的区域中有foo,就会很难渲染URL,因为路由引擎总是会首先找到默认路由。但是,您将能够捕获对foo路线的请求。所以我最好的建议是将foo路线放在一个区域内。