ASP NET MVC Зона маршрутизации / проблема нескольких маршрутов в VB - PullRequest
4 голосов
/ 15 сентября 2011

Я довольно неопытен в .net и только начал изучать MVC. Я столкнулся с проблемой, связанной с обнаружением нескольких контроллеров:

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

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

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

Изучив проблемы, с которыми я столкнулся, я добавил код:

Для моих контроллеров Admin определено правильное пространство имен

  • Пространство имен PowellCasting.Areas.Admin, а не просто PowellCasting.
  • У меня есть RegisterAllAreas, установленный в глобальном
  • ControllerBuilder.Current.DefaultNamespaces.Add ("PowellCasting / Controllers") используется для указания маршрута по умолчанию.

Конкретная проблема, с которой я столкнулся сейчас, заключается в том, что при переходе к "/ Reviews" я получаю ошибку нескольких контроллеров, показанную выше, а именно:

* В запросе 'reviews' найдены следующие подходящие контроллеры: PowellCasting.PowellCasting.Areas.Admin.ReviewsController

PowellCasting.PowellCasting.ReviewsController *

Я включил отладчик маршрута, который показывает только одно совпадение:

ах - как новый пользователь я не могу опубликовать изображение, но оно показывает:

Admin / {controller} / {action} / {id} как FALSE

и

{controller} / {action} / {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

но безуспешно.

Я уверен, что это должно быть просто, и я попробовал несколько вещей - это очень расстраивает. Любая помощь будет очень признательна.

Мой первый пост здесь - Привет! :)

Ответы [ 3 ]

5 голосов
/ 15 сентября 2011

Если внимательно прочитать сообщение об ошибке, которое вы получаете:

В запросе 'обзоры' найдено следующее соответствие контроллеры: 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 голосов
/ 12 октября 2013

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();      
0 голосов
/ 07 марта 2013

У меня тоже была похожая проблема.

У меня было приложение, в котором было две области: Общие, Продукты

И когда я открывал приложение, вызывался маршрут Common_default, нокогда я увидел RoutesCollection.Routes, он показал мне 4 маршрута.На самом деле я определил только 2 маршрута - один для общего пользования, другой для продуктов.

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

Я изменилпространство имен по умолчанию от «MyWebsite.Web» до «MyWebsite».И это сработало.Мое приложение было запущено и работает.

Суть в том, чтобы никогда не иметь "."в пространстве имен по умолчанию для вашего проекта веб-сайта MVC4.

...