【问题标题】:Cannot get rid of "Multiple types were found that match the controller"无法摆脱“找到与控制器匹配的多种类型”
【发布时间】:2012-10-22 12:01:05
【问题描述】:

我已经在 StackOverflow 中尝试了该主题的所有可能链接,这里给出的所有建议,查看了 Rick Anderson 的视频,但没有任何积极的结果。仍然收到可怕的“找到多种类型......”消息。而我的项目只是一个尝试区域现象的设置。 是否可以在 Razor 查看器中使用区域?还是只使用 ASPX??

这就是我所拥有的: 在 Global.asax 中:

   routes.MapRoute( _
        "Default", _
        "{controller}/{action}/{id}", _
        New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, New String() {"MyApplication.Controllers"})

在三个单独的 AreaRegistration 文件中:

        Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
        context.MapRoute( _
            "Shopping_default", _
           "Shopping/{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional})
    End Sub

和:

        Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
        context.MapRoute( _
            "Blog_default", _
           "Blog/{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional})
    End Sub

和:

        Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
        context.MapRoute( _
            "Admin_default", _
           "Admin/{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional})
    End Sub

我拥有三个 AreaRegistration 文件,但没有额外引用“.controller = “Home””,但它们都给出了相同的结果。我还尝试将命名空间的额外参数添加到这三个声明中。我已尝试将此添加到 Global.asax:

        ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Admin.Controllers")
    ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Blog.Controllers")
    ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Shopping.Controllers")

    ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Controllers")

但这也没有积极的结果。我也试过在 AreaRegistration 类中没有应用程序名称。我可以尝试哪些其他可能的行动(并取得成功的结果)? 项目结构很简单:我从一个空项目开始,立即添加了三个区域,HomeControllers 和 Index 视图。没有更改命名空间,尽可能保持默认。使用了 MVC 4 模板。 大家有什么建议吗?

彼得

【问题讨论】:

    标签: razor asp.net-mvc-4 area


    【解决方案1】:

    问题是这样解决的:

    1. 通过添加 %AppName%.Areas.%AreaName%.Controllers 来更改模板为每个控制器提供的默认命名空间。所以在上面的例子中,Admin 区域的 HomeController 被放在了 Namespace 中

      Namespace MyApplication.Areas.Admin.Controllers
      

      这恰好与模板呈现的 AreaRegistration 类中的命名空间相同,并添加了“Controllers”后缀。

    2. 像这样修改 Global.asax 中的代码:

      routes.MapRoute( _
          "Default", _
          "{controller}/{action}/{id}", _
          New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, New String() {"MyApplication"} _
      )
      

      所以这里添加了“MyApplication”命名空间。这在应用程序根 HomeController 中没有添加任何命名空间的假设下是正确的(这是默认设置)。如果根 HomeController 中有命名空间,则应在 Global.asax 文件中使用。

    我发现还有其他方法可以解决同样的问题,但与模板生成的代码相比,这是一种代码更改最少的方法。

    【讨论】:

      【解决方案2】:

      创建区域时,请勿更改其默认命名空间。看起来您将它们从 MyApplication.Areas.Admin.Controllers 更改为 MyApplication.Admin.Controllers(与 BlogShopping 的模式相同)。如果您使用默认约定,则不应收到此错误。

      【讨论】:

      • 嗨 danludwig,虽然我不确定,但我认为您在这里是正确的。我以稍微不同的方式解决了这个问题。我将在下面提供我的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      相关资源
      最近更新 更多