Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC3中,是否可能在不同的区域使用相同的控制器名称?_C#_Asp.net Mvc_Vb.net_Asp.net Mvc 3 - Fatal编程技术网

C# 在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: 及 但我希望它

在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 }

问题是,当我将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。。。