C# 在MVC3中,是否可能在不同的区域使用相同的控制器名称?
在MVC3中,我有以下几个方面:C# 在MVC3中,是否可能在不同的区域使用相同的控制器名称?,c#,asp.net-mvc,vb.net,asp.net-mvc-3,C#,Asp.net Mvc,Vb.net,Asp.net Mvc 3,在MVC3中,我有以下几个方面: 流动的 沙箱 然后我会像这样绘制路线图: context.MapRoute( "Sandbox_default", "Sandbox/{controller}/{action}/{id}", new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional } 及 问题是这会产生如下URL: 及 但我希望它
- 流动的
- 沙箱
context.MapRoute(
"Sandbox_default",
"Sandbox/{controller}/{action}/{id}",
new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional }
及
问题是这会产生如下URL:
及
但我希望它是这样的:
context.MapRoute(
"Sandbox_default",
"Sandbox/{controller}/{action}/{id}",
new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional }
问题是,当我将SandboxHome控制器重命名为Home,将MobileHome控制器重命名为Home(这将提供所需的URL)时,它不会编译,因为它有两个HomeController类 如何在不同区域使用相同的控制器名称?是 正如这篇博文所解释的: 假设您调用了RegisterAlleas和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"}
);
只要将区域控制器保留在其自己的名称空间内。这将起作用。是的,但您必须更改您的路线:
context.MapRoute(
"Default",
"{area}/{controller}/{action}/{id}",
new { area = "Mobile", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
您也可以保留这两条路线,但不要忘记在默认设置中定义区域
重要的
当然,您必须将控制器保留在其自己的区域名称空间中:
namespace MyApp.Areas.Mobile.Controllers
{
public class HomeController : Controller
{
...
}
}
namespace MyApp.Areas.Sandbox.Controllers
{
public class HomeController : Controller
{
...
}
}
检查并查看WalkToul。另外,不要忘了查看关于区域注册的内容,因为您必须调用RegisterAllAreas()
方法
既然你仍然想保留原来的非区域控制器,那么你也应该阅读这篇文章如何做到这一点(应该归功于@Rob在他的回答中首先指出了这篇博文)。但是。。。您将如何翻译此http://localhost:58784/Mobile/Home
URL是否使用您的路线定义?我认为你的答案不对。会在哪个区域?哪个控制器和哪个操作?这是Global.asax路由。一旦指定了此名称空间,就可以不使用区域路由。我在我的应用程序中正是这么做的。请看Phil Haack@Rob yes的这篇博文,你是对的。当您通过VisualStudio创建区域时,它会为您创建区域注册类,以便您可以使用提供的代码。你说得对。但是您可能还应该将调用添加到registeralareas()
call。@Robert是的,我同意您仍然需要registeralareas和区域注册文件。我假设OP已经有了这些,因为它们是由VS@Quanday生成的:我在我的答案中又添加了一个链接。但是关于您在评论中的问题,您可以通过提供第二个路由定义来路由此类URL,而不需要提供特定区域默认值,如area=“Global”
。但是,当area
具有特定字符串值时,您还必须在区域上的第一条路由上添加一个约束,以仅匹配该路由。你知道我在说什么吗?经过大约两个小时的努力,我可以说“{area}”/{这是一个非常糟糕的主意,因为如果你这样做,你网站上的每个url都会重定向到按字母顺序排列的最低区域的默认页面…@Quandary:我严重怀疑这一点。默认值是按路由顺序定义的,而不是按字母表定义的。但没关系,我希望你通过我在最后添加的链接解决了你的问题。无论顺序如何,它始终都是roUTE到同一个位置,这似乎是按字母顺序排列的最低区域-不必如此。但是,下面的解决方案很好。我犯了另一个错误:我将HomeController操作文件命名为Home而不是Index,然后它总是路由到全局Home Index操作-而不是发出HTTP 404。。。