在MVC3中,我有以下几个方面:
- 移动
- 沙盒
然后我像这样路由地图:
context.MapRoute(
"Sandbox_default",
"Sandbox/{controller}/{action}/{id}",
new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional }
和
context.MapRoute(
"Mobile_default",
"Mobile/{controller}/{action}/{id}",
new { controller = "MobileHome", action = "Index", id = UrlParameter.Optional }
);
问题在于这会给网址:
和
但我想这样:
http://localhost:58784/Mobile/Home
http://localhost:58784/Sandbox/Home
问题是当我将SandboxHome-Controller重命名为Home,并将MobileHome-Controller重命名为Home时,它将提供所需的URL,它将无法编译,说它有两个HomeController类。
如何在不同区域拥有相同的控制器名称?
答案 0 :(得分:41)
是。
正如此博客文章所述:http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx
假设您调用了RegisterAllAreas和Visual Studio生成的AreaRegistration文件。您需要做的就是在全局ASAX中使用默认路由上的命名空间来防止冲突。
//Map routes for the main site. This specifies a namespace so that areas can have controllers with the same name
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[]{"MyProject.Web.Controllers"}
);
只要将区域控制器保留在自己的命名空间内。这将有效。
答案 1 :(得分:4)
是的,但您必须更改路线:
context.MapRoute(
"Default",
"{area}/{controller}/{action}/{id}",
new { area = "Mobile", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
您也可以保留两条路线,但不要忘记在默认路线中定义area
。
当然,您必须将控制器保存在自己的区域名称空间中:
namespace MyApp.Areas.Mobile.Controllers
{
public class HomeController : Controller
{
...
}
}
namespace MyApp.Areas.Sandbox.Controllers
{
public class HomeController : Controller
{
...
}
}
检查this link on MSDN并查看walktrough。并且不要忘记查看有关区域注册的this MSDN article,因为您必须调用RegisterAllAreas()
方法。
由于你仍然希望保留原始的非区域控制器,你还应该阅读这个Phil Haack's article如何做到这一点(Credit应该在他的回答中转到@Rob,首先指向这篇博文)。