Возможно ли в MVC3 иметь одно и то же имя контроллера в разных областях?
В MVC3 у меня есть следующие области:
Затем выполните следующие маршруты:
context.MapRoute(
"Sandbox_default",
"Sandbox/{controller}/{action}/{id}",
new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional }
и
context.MapRoute(
"Mobile_default",
"Mobile/{controller}/{action}/{id}",
new { controller = "MobileHome", action = "Index", id = UrlParameter.Optional }
);
Проблема заключается в том, что такие URL:
http://localhost:58784/Mobile/MobileHome
и
http://localhost:58784/Sandbox/SandboxHome
Но я хочу так:
http://localhost:58784/Mobile/Home
http://localhost:58784/Sandbox/Home
Проблема заключается в том, что я переименую SandboxHome-Controller в Home и MobileHome-Controller to Home, который даст нужные URL-адреса, он не будет компилироваться, заявив, что у него есть два класса для HomeController.
Как я могу иметь одно и то же имя контроллера в разных областях?
Ответы
Ответ 1
Да.
Как объясняется в этом сообщении в блоге: http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx
Предполагая, что у вас есть вызов RegisterAllAreas и файлы AreaRegistration, созданные Visual Studio. Все, что вам нужно сделать, это пространство имен по умолчанию в глобальном ASAX для предотвращения конфликтов.
//Map routes for the main site. This specifies a namespace so that areas can have controllers with the same name
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[]{"MyProject.Web.Controllers"}
);
Пока вы держите контроллеры Area в своих собственных пространствах имен. Это будет работать.
Ответ 2
Да, но вам нужно изменить свою маршрутизацию:
context.MapRoute(
"Default",
"{area}/{controller}/{action}/{id}",
new { area = "Mobile", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Вы также можете сохранить оба маршрута, но не забудьте определить area
в своих настройках по умолчанию.
Внимание!
Конечно, вы должны держать контроллеры в своих собственных пространствах имен:
namespace MyApp.Areas.Mobile.Controllers
{
public class HomeController : Controller
{
...
}
}
namespace MyApp.Areas.Sandbox.Controllers
{
public class HomeController : Controller
{
...
}
}
Отметьте эту ссылку в MSDN и просмотрите прохождение. И не забудьте также проверить эту статью MSDN, которая говорит о регистрации области, потому что вам нужно будет вызвать метод RegisterAllAreas()
.
И так как вы все еще хотите сохранить оригинальные контроллеры без зоны, вы также должны прочитать эту статью статью Phil Haack, как это сделать (кредит должен пойти в @Rob в своем ответе за указание на это сообщение в блоге в первую очередь).