【问题标题】:Cannot load view in area in asp.net mvc 3 using vb.net无法使用 vb.net 在 asp.net mvc 3 的区域中加载视图
【发布时间】:2011-08-16 04:03:00
【问题描述】:

我有最新版本的 VS 2010、.NET 4.0 和 MVC 3,但在使用 vb.net 时,我在使用 asp.net mvc 3 中的区域时遇到问题。

我执行以下操作:

  1. 创建一个新的visual basic asp.net mvc 3 项目。选择 Razor 作为“View Engin”并将项目命名为“TestApp”。
  2. 创建一个名为“Test”的新区域,它将在文件夹中:/Areas/Test。
  3. 在 /Areas/Test/Controllers/ 中添加一个名为“PageController.vb”的新空控制器。
  4. 在 /Areas/Test/Views/ 中添加一个名为“Page”的新文件夹。
  5. 在 /Areas/Test/Views/Page 中添加一个名为“Index.vbhtml”的新空视图。
  6. 运行项目。
  7. 在浏览器中手动输入url“http://localhost:xyz/Test/Page”,其中xyz是VS自动生成的端口号。

在第 7 步,我收到消息“找不到资源”。

如果我使用 c# 做完全相同的事情,那么我将进入正确的页面,它会按预期显示单词“索引”。

这是一个错误,还是我遗漏了什么?我已经在网上扫描了几个小时试图解决这个问题,但我没有意识到。

这是自动创建的 TestAreaRegistration.vb 文件 命名空间 TestApp.Areas.Test 公共类TestAreaRegistration 继承 AreaRegistration

    Public Overrides ReadOnly Property AreaName() As String
        Get
            Return "Test"
        End Get
    End Property

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

结束命名空间

这是自动创建的 Global.ascx 文件: ' 注意:有关启用 IIS6 或 IIS7 经典模式的说明, ' 访问http://go.microsoft.com/?LinkId=9394802

公共类 MvcApplication 继承 System.Web.HttpApplication

Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
    filters.Add(New HandleErrorAttribute())
End Sub

Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

    ' MapRoute takes the following parameters, in order:
    ' (1) Route name
    ' (2) URL with parameters
    ' (3) Parameter defaults
    routes.MapRoute( _
        "Default", _
        "{controller}/{action}/{id}", _
        New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
    )

End Sub

Sub Application_Start()
    AreaRegistration.RegisterAllAreas()

    RegisterGlobalFilters(GlobalFilters.Filters)
    RegisterRoutes(RouteTable.Routes)
End Sub

结束类

如果您重复步骤 1-7 并使用 c#,这些与您获得的相同(唯一的区别是您将获得与上述 vb.net 代码相同的 c# 代码)。

我重复一遍:如果我在 C# 中执行步骤 1-7,它可以工作,但在 vb.net 中将无法工作!怎么了?

【问题讨论】:

    标签: c# vb.net asp.net-mvc-3


    【解决方案1】:

    问题是您的控制器不在默认控制器命名空间中。您将需要自己手动引用控制器命名空间。这有一个超载。试试这个:

    Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
            context.MapRoute( _
                "Test_default", _
               "Test/{controller}/{action}/{id}", _
                New With {.action = "Index", .id = UrlParameter.Optional}, _
                New With {"MyDefaultNamespace/Areas/Test/Controllers"} _
            )
    End Sub
    

    默认区域配置文件实际上并不引用区域的控制器命名空间。这是一个不幸的疏忽。因此,除非您将旧控制器复制到新文件夹中(并保留旧名称空间),否则您将在第一次运行时遇到错误。引用正确的命名空间将解决此问题。

    编辑:

    另外,你没有提到任何关于为你的页面创建一个动作的事情......这是一个错字,还是控制器默认带有一个?

    【讨论】:

    • 我使用了创建空控制器时获得的默认操作方法,所以不是那样的。谢谢你让我走上正轨!我再次将两个示例项目并排放置,以查看 c# 和 vb.net 项目之间是否有任何区别,现在我发现“PageController.vb”与“PageController”相比存在一些“命名空间”差异。CS”。似乎 vb.net 版本的 mvc 3 忘记添加正确的命名空间定义,当我更正这一点时,一切都开始工作了!
    • 耶!!几个小时的困惑,我所要做的就是修复每个自动生成的控制器中的命名空间。谢谢!!
    • 这个答案让我走上了正轨,但是,在我看来,第四个参数的语法有点偏离..应该更像这样:命名空间:={“MyDefaultNamespace.Areas.Test.控制器”} 或者至少这对我有用。尽管我的区域控制器不在此命名空间中,但我专门将它们限定为这样并添加了此参数,这一切都在我的 VB.NET MVC 4 Web 应用程序中运行。
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2010-10-27
    • 2019-01-23
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多