razor - 无法摆脱 "Multiple types were found that match the controller"

标签 razor asp.net-mvc-4 area

我已经在 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"})

在三个单独的区域注册文件中:

        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 类中不使用应用程序名称。我可以尝试哪些可能的其他行动(并取得成功的结果)? 项目结构很简单:我从一个空项目开始,立即添加了三个区域:HomeController 和 Index View 。不更改命名空间,全部保留为默认值。使用了 MVC 4 模板。 大家有什么建议吗?

彼得

最佳答案

问题是这样解决的:

  1. 通过添加 %AppName%.Areas.%AreaName%.Controllers,更改模板为每个 Controller 指定的默认命名空间。因此,在上面的示例中,管理区域的 HomeController 被放置在命名空间中

    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 文件中使用该命名空间。

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

关于razor - 无法摆脱 "Multiple types were found that match the controller",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13011016/

相关文章:

asp.net-mvc - 如何在 mvc 的 apicontroller 中获取部分 View 字符串

c# - 多语言 MVC 4 应用程序

c - Gtk 绘图区域上的 Gtk 按钮

javascript - 是否可以隐藏/禁用 ImageMapster 中的区域?

razor - ArgumentNullException : Value cannot be null. 参数名称:viewData

c# - MVC Razor View 嵌套 foreach 的模型

c# - 使用带或不带字符串引号的 Razor 表达式

asp.net-mvc-4 - 重用动态对象 (CurrentPage) 并将其传递给 Partial View MVC Umbraco

c# - 使用 ELMAH 配置自定义授权

java - 检查纬度和经度是否在一个圆圈内