无法使用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 /“中添加一个名为”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#执行完全相同的操作,那么我将进入正确的页面,它将按预期显示“Index”一词。

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

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

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

公共类MvcApplicationinheritanceSystem.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中不起作用! 怎么了?

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

 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 

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

编辑:

此外,您没有提及有关为您的页面创建操作的任何内容…这是一个错字,还是控制器默认配置一个?