Маршрутизация MVC3 с областями

У меня есть приложение MVC3 с двумя областями и корневой областью. Общая структура выглядит как Root

- Root/Areas/Manager
    * Views/Home/Index.cshtml
    * ManagerAreaRegistration.cs
- Root/Areas/Participant
    * Views/Home/Index.cshtml
    * ParticipantAreaRegistraion.cs
- Root
    * Views/Home/Index.cshtml
    * Views/Account/Register.cshtml
    * Global.asax.cs

У меня две проблемы с маршрутизацией. Во-первых, я не могу перейти к каким-либо страницам в папках Root / Views, кроме той, которая установлена ​​по умолчанию в файле Global.asax.cs. Файл Global.asax.cs выглядит так:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
   "Default", // Route name
   "{controller}/{action}/{id}", // URL with parameters
   new {controller="Home" , action = "Index", id = UrlParameter.Optional }, 
   new[] { "MVCApplication.Controllers" }    // for areas 
   );
...     
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
...

И код в Root / Views / Home / Index.cshtml, который является стартовой страницей, выглядит так:

@Html.ActionLink("Accounts","Register", new {area="", controller="Accounts"},null)
@Html.ActionLink("Manager", "Index", new { area = "Manager", controller = "Home" })
@Html.ActionLink("Participant", "Index", new { area = "Participant", controller = "Home" })

Две ссылки на области работают нормально, поскольку я добавил маршруты в файлы регистрации в каждой области, но ссылка на Accounts / Register, которая является другой страницей в корне, дает ошибку «ресурсы не найдены». Однако, если я изменю маршрут Global.asax.cs, чтобы иметь

    new {controller="Accounts" , action = "Register", id = UrlParameter.Optional }, 

в маршруте по умолчанию, тогда я могу начать со страницы регистрации.

Итак, мой первый вопрос: Как мне использовать маршруты, чтобы получить доступ к обеим страницам в областях и в корневом каталоге (т. е. странице учетных записей / регистрации)?

Второй вопрос касается самих областей. Поскольку у них обоих есть «Домашний» контроллер, я поставил название области перед одним, чтобы его можно было различить, но мне бы хотелось, чтобы этого не делали. В настоящее время файл ParticipantAreaRegistration.cs имеет код:

  context.MapRoute(
            "Participant_default",
            "Participant/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
          new[] { "MvcApplication.Areas.Participant.Controllers"  }    // for areas 
            );

который дает URL "localhost * * / Participant / Home"

в то время как ManagerAreaRegistraion.cs имеет код

 context.MapRoute(
            "Manager_default",
            "{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
                         new[] { "MvcApplication.Areas.Manager.Controllers" }    // for areas 

        );

что дает URL "localhost *** / Home /"

Мой второй вопрос: Как я могу получить URL-адрес localhost ** / Home как для Менеджера, так и для Участника (или для любого количества областей), не отображая название области в URL-адресе?

Я знаю, что этот вопрос аналогичен другим, уже имеющимся в файле, но я изучил их безрезультатно и в настоящее время тону в неэффективности, поэтому я подумал, что попробую задать конкретный вопрос. Спасибо.


person Anne    schedule 24.01.2012    source источник


Ответы (1)


Вы можете использовать настраиваемую маршрутизацию.

Что-то похожее на это:

Порядок маршрутов регистрации области MVC 2

Используя решение указанной выше проблемы, вы можете написать собственный порядок маршрутизации.

В одном из моих приложений у меня есть области с именами Admin, Blog, Members и Public. Я направил общедоступную область как URL: http://localhost:4000/, Admin as: http://localhost:4000/admin, блог как: http://localhost:4000/blog и т. д. Если вам нужен мой код, я могу вам его предоставить.

person Sunil Raj    schedule 24.01.2012
comment
Спасибо за ваш ответ. Я знаю, что это должно сработать, но пока не добился успеха. Если вы не против поделиться своим кодом, возможно, это поможет. Если вы можете заархивировать его и отправить ... или просто поместите соответствующие фрагменты в электронное письмо, это было бы круто. (Aespaldi в Gmail). - person Anne; 24.01.2012