Не удается избавиться от Обнаружено несколько типов, соответствующих контроллеру

Я перепробовал все возможные ссылки на эту тему в StackOverflow, все предложения, приведенные здесь, просмотрел видео Рика Андерсона, но без какого-либо положительного результата. Все еще получаю ужасное сообщение "Найдено несколько типов...". И мой проект — это просто установка, чтобы попробовать феномен Района. Возможно ли вообще использование Area с программой просмотра Razor? Или только с ASPX??

Вот что у меня есть: В Global.asax:

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

В трех отдельных файлах AreaRegistration:

        Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
        context.MapRoute( _
            "Shopping_default", _
           "Shopping/{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional})
    End Sub

и:

        Public Overrides Sub RegisterArea(ByVal context As System.Web.Mvc.AreaRegistrationContext)
        context.MapRoute( _
            "Blog_default", _
           "Blog/{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional})
    End Sub

и:

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

У меня было три файла AreaRegistration БЕЗ дополнительной ссылки на ".controller = "Home" ", но все они дают одинаковые результаты. Я также попытался добавить в эти три объявления дополнительный параметр для пространства имен. Я попытался добавить это в Global.asax:

        ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Admin.Controllers")
    ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Blog.Controllers")
    ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Shopping.Controllers")

    ControllerBuilder.Current.DefaultNamespaces.Add("MyApplication.Controllers")

но и это без положительного результата. Я также пробовал без имени приложения в классах AreaRegistration. Какие другие возможные действия я могу попробовать (и с успешными результатами)? Структура проекта проста: я начал с пустого проекта, сразу же добавил три области, HomeControllers и представления Index. Никаких изменений в пространствах имен, все оставлено по умолчанию, насколько это возможно. Использовался шаблон MVC 4. Любые предложения от кого-либо?

Питер


person Peter Klein    schedule 22.10.2012    source источник


Ответы (2)


Вопрос решился так:

  1. Измените пространства имен по умолчанию, заданные шаблоном, для каждого контроллера, добавив %AppName%.Areas.%AreaName%.Controllers. Итак, в приведенном выше примере HomeController для области администратора был помещен в пространство имен.

    Namespace MyApplication.Areas.Admin.Controllers
    

    Это то же самое пространство имен, что и в классе AreaRegistration, который был обработан шаблоном, с добавленным к нему суффиксом «Контроллеры».

  2. Измените код в Global.asax следующим образом:

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

    Итак, здесь добавлено пространство имен «MyApplication». Это работает правильно ПРИ ПРЕДПОЛАГАНИИ, что в корневой HomeController приложения НЕ добавлено ПРОСТРАНСТВО ИМЕН (это значение по умолчанию). Если в корневом HomeController есть пространство имен, его следует использовать в файле Global.asax.

Я обнаружил, что есть и другие способы решения той же проблемы, но это тот, в котором код меняется НАИМЕНЕЕ по сравнению с кодом, сгенерированным шаблоном.

person Peter Klein    schedule 22.10.2012

Когда вы создаете свои области, не меняйте их пространства имен по умолчанию. Похоже, вы изменили их с MyApplication.Areas.Admin.Controllers на MyApplication.Admin.Controllers (то же самое с Blog и Shopping). Если вы используете соглашения по умолчанию, вы не должны получать эту ошибку.

person danludwig    schedule 22.10.2012
comment
Привет danludwig, Хотя я не уверен, я думаю, что вы здесь правы. Я решил проблему немного другим способом. Я предоставлю свое решение ниже. - person Peter Klein; 22.10.2012