Mam aplikację MVC3 z dwoma obszarami i obszarem głównym. Wygląda ogólna struktura Korzeń
- 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
Mam dwa problemy z routingiem. Pierwszym z nich jest to, że nie mogę przejść do żadnych stron w folderach głównego katalogu / widoków, z wyjątkiem tych, które są domyślnie ustawione w pliku Global.asax.cs. Plik Global.asax.cs wygląda następująco:
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();
...
Kod w katalogu głównym / widoki / strona główna / index.cshtml, który jest stroną startową, wygląda następująco:
@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" })
Dwa łącza obszarowe działają dobrze, jak dodałemtrasy do plików rejestracyjnych w każdym obszarze, ale link do konta / rejestru, który jest inną stroną w katalogu głównym, powoduje "błąd braku zasobów". Jednak jeśli zmienię trasę Global.asax.cs na
new {controller="Accounts" , action = "Register", id = UrlParameter.Optional },
na domyślnej trasie, mogę rozpocząć na stronie rejestru.
Moje pierwsze pytanie brzmi: Jak korzystać z tras, aby uzyskać dostęp do obu stron w obszarach i w katalogu głównym (np. Strona Konta / Rejestracja)?
Moje drugie pytanie dotyczy obszarówsami. Ponieważ oba mają kontroler "domowy", nazwa obszaru została umieszczona przed nim, aby je odróżnić, ale nie chciałbym tego robić. Obecnie plik "ParticipantAreaRegistration.cs ma kod:
context.MapRoute(
"Participant_default",
"Participant/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "MvcApplication.Areas.Participant.Controllers" } // for areas
);
co daje URL "s" localhost **/ Uczestnik / Strona główna "
podczas gdy ManagerAreaRegistraion.cs ma kod
context.MapRoute(
"Manager_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new[] { "MvcApplication.Areas.Manager.Controllers" } // for areas
);
co daje adresy URL "localhost *** / Home /"
Moje drugie pytanie brzmi: Jak mogę uzyskać adres URL "localhost ** / Home dla menedżera i uczestnika (lub dla dowolnej liczby obszarów) bez konieczności wyświetlania nazwy obszaru w adresie URL?
Wiem, że to pytanie jest podobne do innych już zapisanych w aktach, ale przetrząsnąłem je bezskutecznie i obecnie tonę w nieefektywności, więc pomyślałem, że spróbuję zapytać ze specyfiką. Dzięki.
Odpowiedzi:
0 dla odpowiedzi № 1Możesz użyć niestandardowego routingu.
Coś podobnego do tego:
MVC 2 RejonRejestracja Trasowanie trasy
Korzystając z rozwiązania opisanego powyżej, możesz wpisać niestandardową kolejność routingu.
W jednej z moich aplikacji mam obszary o nazwie Administrator, Blog, Członkowie i Publiczny. Przekierowałem obszar publiczny jako adres URL: http://localhost:4000/, Admin jako: http://localhost:4000/admin, blog tak jak: http://localhost:4000/blog, itp. Jeśli chcesz mój kod, mogę dać ty.