2011-09-14 4 views
4

Я довольно неопытный с .net и только начал изучать MVC. Я столкнулся с проблемой, связанной с обнаружением нескольких контроллеров:ASP NET MVC Area routing/multiple routes issue in VB

«Было найдено несколько типов, которые соответствуют контроллеру с именем« обзоры ». Это может произойти, если маршрут, обслуживающий этот запрос ('{controller}/{action}/{id} ') не определяет пространства имен для поиска контроллера, который соответствует запросу. Если это так, зарегистрируйте этот маршрут, вызвав перегрузку метода «MapRoute», который принимает параметр «пространства имен».

Я недавно добавил новую область «Админ» к моему приложению и в рамках этого у меня есть «ReviewController». Существует также «ReviewController» в основной папке приложения:

ah - как новый пользователь Я не могу опубликовать изображение, но в основном у меня есть «ReviewController» в «Контроллерах» и в разделе «Области/Админ/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,

и

{контроллер }/{action}/{id} as 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, которое автоматически добавляет его, я полагаю, это имя вашей заявки)

и внутри AdminAreaRegistration.vb:

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 маршрута. На самом деле я определил только 2 маршрута - один для общего, один для продуктов.

После прочтения вышеприведенных комментариев, я просто попросил меня изменить свойства проекта для моего сайта.

Я изменил пространство имен по умолчанию с «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();