无法使用vb.net加载asp.net mvc 3中的区域视图

时间:2011-04-30 18:13:05

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

我有最新版本的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 /".
  4. 中添加一个名为“PageController.vb”的新空控制器
  5. 在/ Areas / Test / Views /中添加一个名为“Page”的新文件夹。
  6. 在/ Areas / Test / Views / Page中添加一个名为“Index.vbhtml”的新空视图。
  7. 运行项目。
  8. 在浏览器中手动输入网址“http:// localhost:xyz / Test / Page”,其中xyz是VS生成的自动添加的端口号。
  9. 在第7步,我收到消息“无法找到资源”。

    如果我使用c#执行完全相同的操作,那么我将进入正确的页面,它将按预期显示“Index”一词。

    这是一个错误,还是我错过了什么?我一直在扫描网络数小时试图解决这个问题,但我现在正在接受。

    这是自动创建的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

    Public Class 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中不起作用!有什么问题?

1 个答案:

答案 0 :(得分:7)

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

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

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

修改

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