ASP.NET MVC 4 - 2 области с сегментами, 1 область без

Я только что создал новое решение ASP.NET MVC 4 и добавил 3 области и хотел бы, чтобы они маршрутизировались, как указано:

1. General         -> http://www.mysite.com/
2. Members         -> http://www.mysite.com/members/
3. Administration  -> http://www.mysite.com/administration/

Я могу настроить маршрутизацию так, чтобы «Общая» область работала, когда это первый сегмент, но не могу заставить мою маршрутизацию работать во всех 3-х областях, когда я не хочу, чтобы «Общая» отображалась как сегмент в URL-адресе. Как видите, я стремлюсь к чистой структуре URL.

Я планирую добавить несколько контроллеров / представлений для каждой области и хотел бы сохранить эту организацию областей.

Я видел аналогичную проблему MVC 2, опубликованную, но не уверен, что порядок регистрации областей решит мою конкретную проблему.


person Bern    schedule 02.04.2012    source источник
comment
Разве генералу действительно нужна зона? Кажется, что это должно быть основную часть вашего сайта (не в какой-либо области), и тогда участники и администрация - это две области.   -  person Ethan Brown    schedule 02.04.2012
comment
Привет, Итан. Есть такой вариант, но в идеале я хотел бы оставить все контроллеры / представления в пределах одной области, поскольку общая область со временем станет довольно большой.   -  person Bern    schedule 02.04.2012
comment
Или добавьте в свои области в пространствах имен. Попробуйте это так: context.MapRoute( name: "Dashboard_Site", url: "Dashboard/{controller}/{action}/{id}", defaults: new { area = "Dashboard", controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new {"WebSite.Areas.Dashboard.Controllers"});   -  person Elyor    schedule 30.04.2013


Ответы (1)


Откройте файл GeneralAreaRegistration.cs.

Найдите это:

context.MapRoute(
    "General_default",
    "General/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);

... и замените на это:

context.MapRoute(null,
    "{controller}/{action}/{id}",
    new { controller = "General", action = "Index", id = UrlParameter.Optional }
);

Ответить на комментарии:

Предполагая, что вы используете URL http://www.mysite.com/members, и предполагая, что он находится в вашем файле MembersAreaRegistration.cs:

context.MapRoute(
    "Members_default",
    "Members/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

... тогда он должен работать. Однако, если у вас нет controller = "Home" фрагмента в параметрах MapRoute по умолчанию, тогда URL-адрес должен быть http://www.mysite.com/members/home.

person danludwig    schedule 02.04.2012
comment
Это определенно решило проблему с URL-адресом (спасибо), однако мой очень простой HomeController в зоне для участников теперь возвращает 404. Требуется ли некоторая корректировка для вызовов по умолчанию .MapRoute()? - person Bern; 03.04.2012
comment
Привет. Это точно так же, как и в моем коде, поэтому нет никаких изменений, поскольку 404 все еще появляется. Должен ли я вручную регистрировать область участников перед общей областью в Global.asax? - person Bern; 03.04.2012
comment
@Bern нет, я так не думаю. Все области должны быть прописаны строкой AreaRegistration.RegisterAllAreas() в global.asax. Вы не изменили ни одно из пространств имен области, не так ли? Если вы вернетесь к исходному MapRoute для области General, исчезнет ли проблема 404? - person danludwig; 03.04.2012
comment
Спасибо за вашу помощь @danludwig, сегодня я в конце концов разобрался с этим. В VS2010 с использованием .NET 4 я мог бы решить проблему с помощью вашего кода. В VS2011 Beta с использованием .NET 4.5 мне пришлось сделать 2 вещи (1), вручную зарегистрировать каждую область в Global.asax и убедиться, что общая область была зарегистрирована последней - по умолчанию он регистрирует области в алфавитном порядке (проблема). Если я создал область под названием Aardvark, все было в порядке ‹sigh›, и (2) явно добавил пространства имен в вызовы MapRoute (). Приносим извинения за то, что не указали мою исходную версию IDE и фреймворка ранее, и спасибо за вашу помощь. - person Bern; 03.04.2012