/富/ {控制器} / {行动} / {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}。
当我把/ foo路由注册放在底部时似乎工作得更好 这提出了一个问题,什么被认为是/默认路线? (由于默认路线被建议放在最后。)
答案 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路线放在一个区域内。