Подтвердить что ты не робот

Возможно ли в 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.

Как я могу иметь одно и то же имя контроллера в разных областях?

4b9b3361

Ответ 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 в своем ответе за указание на это сообщение в блоге в первую очередь).