区域路线问题(沿着地区)
我应该如何配置下列非区域路线?
/富/ {控制器} / {行动} / {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" }
);
找到多个与名为“菜单”的控制器相匹配的类型。 如果为该请求提供服务的路由( 'foo / {controller} / {action} / {id}' )没有指定命名空间来搜索与该请求匹配的控制器,就会发生这种情况。
'Menu'的请求找到了以下匹配的控制器: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路由注册在底部时似乎工作得更好。
这提出了一个问题,什么被视为一个/默认路线? (因为默认路线被建议放在最后。)
您有两个名称为MenuController
控制器,因此如果您不提供更多信息,MVC不知道要使用哪一个控制器。 在您的区域中,您可能有一个名为<YourAreaName>AreaRegistration
。 打开这些文件并更新RegisterArea
方法,以便将请求路由到正确的控制器。
从你的错误消息,它似乎是路由映射到foo / {controller} / {action} / {id},它没有MenuController
。 我的猜测是你在某个页面上的某个页面上有一个动作链接。 如果您未指定链接的区域,则会生成不正确的链接。
尝试使用ActionLink
使用默认路由:
@Html.ActionLink("Some text", "action", "controller", new { area = "" }, null)
如果您希望请求转到特定区域,只需在通话中写下。
更新:问题是,当你写Ajax.BeginForm("SaveSomething", "Home",...)
之类的东西Ajax.BeginForm("SaveSomething", "Home",...)
它会匹配第一条路线。 由于foo路由不是一个区域,所以你不能通过将区域放在BeginForm
语句中来解决这个问题。 你有两个选择,1:将foo部分移动到一个区域,2:将foo路由放在默认路由之后。 如果您将默认路由放在foo路由之前,只要您将foo与默认路由(默认区域)放在同一区域,就会很难渲染url,因为路由引擎会始终首先找到默认路由。 但是,您将能够捕捉到foo路由的请求。 所以我最好的建议是把foo路线放在一个区域。