Добавление маршрута для контроллеров администратора - PullRequest
1 голос
/ 12 декабря 2011

Я поместил все свои контроллеры администратора в папку Admin в папке Controller . Так как один из моих контроллеров администратора соответствует имени другого контроллера в папке Controller , я получаю следующую ошибку.

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

Я попытался добавить следующий маршрут, но проблема все та же

routes.MapRoute(
    "", //Route name 
    "Admin/{controller}/{action}/{id}", // Url with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

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

1 Ответ

6 голосов
/ 12 декабря 2011

Я поместил все свои контроллеры администратора в папку администратора в папке контроллера

Ну, это твоя проблема. Как вы ожидаете, что фабрика контроллеров по умолчанию узнает, какой контроллер вы хотите создать при следующем запросе /admin/index (тот, что находится в папке «Контроллеры» или включен в папке «Контроллеры / Администратор»)? Помните, что фабрика контроллеров по умолчанию ищет типы в загруженных сборках, производных от контроллера. Это действительно не волнует, в какой папке они были объявлены. Поэтому, когда он обнаруживает, что у вас есть 2 контроллера с одинаковым именем, он не знает, какой из них выбрать.

Одна из возможностей - использовать Области. Тогда вы могли бы указать пространства имен при регистрации маршрута:

routes.MapRoute(
    "", 
    "Admin/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Areas.Admin.Controllers" }
);

Также в вашем Global.asax убедитесь, что вы указали пространство имен для контроллеров без области:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new[] { "AppName.Controllers" }
);
...