【问题标题】:Map a URL to controllers with the same name将 URL 映射到具有相同名称的控制器
【发布时间】:2013-02-22 19:07:33
【问题描述】:

我有以下路由:

routes.MapRoute("Home", "{language}-{culture}/{controller}/{action}");

然后我有两个这样的控制器:

Controllers
--->en-EN
-------->HomeController
--->pt-PT
-------->HomeController

不幸的是,这不起作用,我收到此错误:

“找到了与名为“Home”的控制器匹配的多种类型。如果为该请求提供服务的路由(“{language}-{culture}/{controller}/{action}”)未指定命名空间,则可能会发生这种情况搜索与请求匹配的控制器。如果是这种情况,请通过调用采用“namespaces”参数的“MapRoute”方法的重载来注册此路由。

“Home”请求找到了以下匹配的控制器:

MvcApplication2.Controllers.en_EN.HomeController
MvcApplication2.Controllers.pt_PT.HomeController"

我尝试将命名空间“MvcApplication2.Controllers”添加为参数,但它仍然存在,但我不明白它是如何工作的,但这是我在互联网上找到的解决方案。

我刚刚开始使用 ASP.Net MVC,所以如果我错过了一些非常基本的东西,请不要抱歉。

非常感谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing directory-structure


    【解决方案1】:

    你会有很多不同的文化吗?您可能想考虑使用MVC Areas。它们就是为这种事情而生的。

    如果你只有 2 个,你可以像这样硬编码你的路线:

    routes.MapRoute(
         "HomeEn", // Route name
         "en-EN/{controller}/{action}", // URL with parameters
         new { controller = "Home", action = "Index" }, // Parameter defaults
         new string[] { "MvcApplication2.Controllers.en_EN"}
    );
    
    routes.MapRoute(
         "HomePt", // Route name
         "pt-PT/{controller}/{action}", // URL with parameters
         new { controller = "Home", action = "Index" }, // Parameter defaults
         new string[] { "MvcApplication2.Controllers.pt_PT"}
    );
    

    【讨论】:

    • 感谢您的回复马克。它可以工作,但为什么不能使用通用形式:routes.MapRoute( "Home", "{language}-{culture}/{controller}/{action}", new {controller = "Home", action = "Index"}, new[] {"MvcApplication2.Controllers.{language}_{culture}"} ); 工作?
    • 是的,我将拥有两种以上的文化,但我不想使用区域,至少暂时不会。
    • 因为语言和文化的路由值不是以您可以通过代码传递到字符串 [] 的方式存储的。您也许可以做某种路由约束,但它会是真的很难。如果您正在为不同的文化创建网站的新区域,您为什么反对区域?它们不会增加太多开销,并且可以帮助您将不同的区域分开..
    • 嗨,马克,我对区域没有任何反对意见,实际上我不知道它们。我在 2004/2006 年使用 Java 与 MVC 一起工作,因此我试图将我对 MVC 的了解利用到 ASP.MVC 中。
    • 啊 - 不是为了打败死马 - 但你所做的是真正的领域。尽早创建它们比稍后创建它们要容易得多,并且必须移动所有代码。就像添加区域和控制器一样简单! :)
    【解决方案2】:

    这似乎是一个常见的误解。 MVC 路由与您的文件系统没有任何关联。您可以在嵌套文件夹中任意深埋您的控制器,对于 MVC,它仍然只是 HomeController

    【讨论】:

    • 是的,你是对的,我不久前读过一些关于它的东西,但似乎错过了。谢谢
    最近更新 更多