【发布时间】:2011-09-26 10:37:28
【问题描述】:
应该如何配置以下非区域路由?
/foo/{controller}/{action}/{id}
映射到命名空间 myapp.foo 中的控制器。
/{controller}/{action}/{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 路由注册放在底部时,它似乎工作得更好。
这就提出了一个问题,什么被认为是/默认路由? (因为建议将默认路由放在最后。)
【问题讨论】:
-
我是否更正了失败的请求是
foo/menu,并且foo命名空间中没有MenuController? -
@counsellorben 这几乎是正确的。我通过浏览器中的 url 框点击 /Home/Index 。相应的索引视图位于包含以下代码的母版页中:
<% Html.RenderAction( "Index", "Menu", new { theController = ViewContext.RouteData.Values["controller"].ToString(), theAction = ViewContext.RouteData.Values["action"].ToString() }); %>。 foo 命名空间中没有菜单控制器。我不明白为什么它匹配那条路线。 -
母版页是否在 foo 命名空间中?另外,为什么你有标记“theController”和“theAction”?它们在哪里使用?
-
@counsellorben 一个 mvc 母版页没有命名空间 afaik,但它驻留在 /views/shared 中,如果这就是你的意思。标记是动作的参数。顺便说一句,问题已更新。
标签: c# asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing