2011-04-30 62 views
6

我有最新版本的VS 2010,.NET 4.0和MVC 3,並且在使用vb時,在asp.net mvc 3中有一個問題。淨。無法在asp.net mvc 3中使用vb.net加載視圖

我做到以下幾點:

  1. 創建一個新的Visual Basic asp.net MVC 3項目。選擇Razor作爲「查看引擎」並調用項目「TestApp」。
  2. 創建一個名爲「Test」的新區域,它將位於文件夾:/ Areas/Test中。
  3. 添加堪稱/地區「PageController.vb」一個新的空控制器/測試/控制器/頁‘」。
  4. 在/區/測試/瀏覽/被叫添加一個新文件夾’。
  5. 添加新在/ Areas/Test/Views/Page
  6. 中運行該項目
  7. 在瀏覽器中手動輸入url「http:// localhost:xyz/Test/Page」,其中xyz是由VS生成的自動添加的端口號

在步驟7,我得到消息「The resource ca找不到「。

如果我使用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

公共類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 

末級

這些是你會得到什麼,如果你repete步驟1-7,並使用C#一樣的(唯一的區別是,你會獲取等於vb.net代碼的c#代碼)。

我重複:如果我在C#中執行步驟1-7,它可以工作,但它在vb.net中不起作用!哪裏不對?

回答

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 

默認區域配置文件實際上並沒有引用區域的控制器名稱空間。這是一個不幸的疏忽。因此,除非您將舊的控制器複製到新的文件夾中(並保留舊的命名空間),否則您會在第一時間發現錯誤。引用正確的名稱空間將解決這個問題。

編輯:

而且,你沒有提到關於你的頁面創建一個動作......什麼,這是一個錯字,還是配備了一個默認的控制器?

+1

我使用了創建空控制器時得到的默認操作方法,所以不是這樣。謝謝讓我走上正軌!我將兩個示例項目並排放置,以查看c#和vb.net項目之間是否存在任何差異,現在我發現在「PageController」與「PageController」相比,「PageController.vb」有一些「名稱空間」差異的.cs」。看來mvc 3的vb.net版本忘了添加正確的命名空間定義,當我糾正這一切時,一切開始奏效! – Thomas 2011-04-30 19:22:50

+0

耶!幾小時的困惑,而我所要做的就是修復每個自動生成的控制器中的命名空間。謝謝!! – user158017 2011-08-03 18:23:39

+1

這個答案讓我在正確的軌道上,但是,在我看來,第四個參數的語法是有點關閉..應該更像這樣:namespaces:= {「MyDefaultNamespace.Areas.Test.Controllers」}或至少這是什麼爲我工作。雖然我的區域控制器不在這個命名空間中,但我特意將它們作爲範圍,並添加了這個參數,並且它在我的VB.NET MVC 4 Web應用程序中一直工作。 – bkwdesign 2014-01-08 17:22:12

相關問題