2011-09-14 118 views
4

多條路線的問題我與.NET非常缺乏經驗,剛開始學習MVC。我遇到了一個關於多個控制器被發現的問題:ASP NET MVC區域的路由/ VB中

「發現多個類型與名爲'reviews'的控制器相匹配,如果爲該請求提供服務的路由('{controller}/{action}/{ID}')未指定的命名空間來搜索控制器,該控制器的請求相匹配。如果是這種情況下,通過調用的過載寄存器這條路線‘圖路線’的方法,需要一個‘命名空間’參數「。

我最近增加了一個新的「管理」區域,以我的應用程序中,我有一個「ReviewController」。在主應用程序文件夾中還有一個「ReviewController」:

ah - 作爲新用戶,我無法發佈圖像,但基本上在「控制器」和「Areas/Admin/Contollers」。

我有2種途徑成立至今:

在Global.asax.vb默認路由

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}, _ 
     {"PowellCasting/Controllers"} 
    ) 

    End Sub 

    Sub Application_Start() 

    AreaRegistration.RegisterAllAreas() 

    System.Data.Entity.Database.SetInitializer(New System.Data.Entity.DropCreateDatabaseIfModelChanges(Of Models.PowellCastingEntites)) 
    Database.SetInitializer(Of PowellCastingEntites)(New PowellCastingInitializer()) 

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

    ControllerBuilder.Current.DefaultNamespaces.Add("PowellCasting/Controllers") 

    End Sub 

區路線AdminAreaRegistration

Namespace PowellCasting.Areas.Admin 
    Public Class AdminAreaRegistration 
    Inherits AreaRegistration 

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

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

閱讀後左右我遇到的問題,我添加了一些代碼:

我的管理控制器都具有正確的命名空間中定義

  • 命名空間PowellCasting.Areas.Admin而不是簡單地PowellCasting。
  • 我在全局設置了RegisterAllAreas
  • ControllerBuilder.Current.DefaultNamespaces.Add(「PowellCasting/Controllers」)是爲了指定默認路由。

我現在有具體的問題是,當我去「/點評」我得到上面所示的多個控制器錯誤,具體如下:

*爲「評論」的請求已經發現了下面的匹配控制器: PowellCasting.PowellCasting.Areas.Admin.ReviewsController

PowellCasting.PowellCasting.ReviewsController *

我已經啓用了路由調試器和只顯示一個匹配:

啊 - 作爲一個新的用戶,我不能張貼圖片,但它顯示:

管理/ {控制器}/{行動}/{ID}爲FALSE

{控制器}/{行動}/{ID}爲TRUE

這是預期,所以我不知道爲什麼我收到的問題。

我已經閱讀了有關使用命名空間重載maproute方法的問題,但無法在VB中找到示例(在c#中加載)。但我想這:

Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext) 
    context.MapRoute(_ 
     "Admin_default", _ 
    "Admin/{controller}/{action}/{id}", _ 
     New With {.Controller = "Dashboard", .action = "Index", .id = UrlParameter.Optional}, _ 
     vbNull, 
     {"PowellCasting/Areas/Admin/Controllers"} 
) 
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}, _ 
    vbNull, 
    {"PowellCasting/Controllers"} 
) 

End Sub 

但沒有成功。

我確信這應該是直接的,我已經嘗試了很多事情 - 這非常令人沮喪。任何幫助將非常感激。

我的第一篇文章就在這裏 - 嗨! :)

回答

5

如果你仔細閱讀你所得到的錯誤消息:

爲「評論」的請求已發現以下的匹配 控制器:PowellCasting.PowellCasting.Areas.Admin.ReviewsController PowellCasting.PowellCasting .ReviewsController

你會注意到PowellCasting被重複兩次。

所以在主路徑的Global.asax登記:

routes.MapRoute(_ 
    "Default", _ 
    "{controller}/{action}/{id}", _ 
    New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}, _ 
    vbNull, 
    {"PowellCasting.Controllers"} 
) 

此假定在根您ReviewController的定義如下:

Namespace Controllers 
    Public Class ReviewController 
     Inherits System.Web.Mvc.Controller 

     Function Index() As ActionResult 
      Return View() 
     End Function 
    End Class 
End Namespace 

通知不存在在所述PowellCasting前綴的命名空間定義(這是一個VB自動添加它的subtility,我想這就是你的應用程序的名稱)

並且裏面的​​:

context.MapRoute(_ 
    "Admin_default", _ 
    "Admin/{controller}/{action}/{id}", _ 
    New With {.action = "Index", .id = UrlParameter.Optional}, _ 
    vbNull, _ 
    {"PowellCasting.Areas.Admin.Controllers"} 
) 

即假設你ReviewController在這個區域,像這樣

Namespace Areas.Admin.Controllers 
    Public Class ReviewController 
     Inherits System.Web.Mvc.Controller 

     Function Index() As ActionResult 
      Return View() 
     End Function 
    End Class 
End Namespace 

再次注意到沒有命名空間中定義的PowellCasting前綴定義。

+0

感謝您的快速響應 - 這工作! :)我仍然試圖讓自己的頭腦全面,但它開始有意義。我試着去「/ admin」,但失敗了,但它也是我的名字空間包含「PowellCasting」。一旦我把它解決了,它也可以工作。再次感謝你的幫助。 – Ian

0

我也有類似的問題。

我有一個應用程序,我有兩個領域:通用,產品

當我打開應用程序時,Common_default路線被調用,但是當我看到RoutesCollection.Routes,它向我展示了4路。其實我只定義了兩條路線 - 一條是通用的,一條是產品。

閱讀上述評論後,我剛剛給了它一個嘗試,我改變了我的網站的項目屬性。

我將默認名稱空間從「MyWebsite.Web」更改爲「MyWebsite」。它做到了訣竅。我的應用程序已經啓動並正在運行。

底線永遠不會有「。「在你的MVC4網站項目的默認命名空間

0

DealerNetworksAreaRegistration.cs: //添加面

context.MapRoute(
       "DealerNetworks_default", 
       "DealerNetworks/{controller}/{action}/{id}", 
       new { controller = "Dealer", action = "Index", id = UrlParameter.Optional } 
      ); 

RouteConfig.cs

//Add Namespace 

routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       //passing the namespace of the HomeController in the Main area using namespace parameter. 
       namespaces: new[] { "SMART.Controllers" } 
      ); 

的Global.asax .cs

//Register Areas 

AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth();