2

我已经在 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 模板。任何人的任何建议?

彼得

4

2 回答 2

2

问题是这样解决的:

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

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

于 2012-10-22T19:45:31.263 回答
0

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

于 2012-10-22T17:17:09.967 回答