Razor 无法摆脱;找到多个与控制器匹配的类型;

Razor 无法摆脱;找到多个与控制器匹配的类型;,razor,asp.net-mvc-4,area,Razor,Asp.net Mvc 4,Area,我在StackOverflow中尝试了与这个主题的所有可能的链接,这里给出的所有建议,观看了Rick Anderson的视频,但没有任何积极的结果。仍然收到可怕的“发现了多种类型…”消息。我的项目只是一个尝试区域现象的设置。 Razor viewer是否可以使用区域?或者只使用ASPX 这就是我所拥有的: 在Global.asax中: routes.MapRoute( _ "Default", _ "{controller}/{action}/{id}",

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

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

   routes.MapRoute( _
        "Default", _
        "{controller}/{action}/{id}", _
        New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, New String() {"MyApplication.Controllers"})
        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")
在三个单独的区域注册文件中:

        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
以及:

以及:

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

   routes.MapRoute( _
        "Default", _
        "{controller}/{action}/{id}", _
        New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, New String() {"MyApplication.Controllers"})
        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")
但这也没有积极的结果。我也尝试过在区域注册课程中不使用应用程序名称。我还可以尝试哪些其他可能的行动(并取得成功)? ProjectStructure很简单:我从一个空项目开始,立即添加了三个区域,HomeController和索引视图。不更改名称空间,所有名称空间都保留为默认名称空间。使用了MVC4模板。 有人有什么建议吗


Peter

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

问题是这样解决的:

  • 通过添加%AppName%.Areas.%AreaName%.Controllers,更改模板为每个控制器提供的默认命名空间。因此,在上面的示例中,管理区域的HomeController放在名称空间中

    Namespace MyApplication.Areas.Admin.Controllers
    
    这恰好与模板呈现的AreaRegistration类中的名称空间相同,并添加了“Controllers”后缀

  • 更改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文件中使用该名称空间


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

    嗨,danludwig,尽管我不确定,但我认为您在这里是正确的。我用稍微不同的方法解决了这个问题。我将在下面提供我的解决方案。