MVC2 What's new part 3.
Areas czyli obszary
Areas pozwalają na rozbicie aplikacji na obszary. Każdy z obszarów będzie miał swój zestaw kontrolerów, widoków i routing. Wszystkie obszary mogą nadal korzystać z katalogu Shared, nadal możemy mieć główny obszar (ten który był dostępny do tej pory).
Dodanie obszaru jest proste:
Utworzony zostanie katalog Areas
a w nim nasz nowy obszar oraz nowy zestaw katalogów ze strukturą MVC.
Została również utworzona klasa typu AreaRegistration. Region zostanie automatycznie zarejestrowany dzięki AreaRegistration.RegisterAllAreas();
który jest wywoływany na Application_Start()
W moim przypadku namespace gdzie znajduje się domyślny kontroler Home to Controllers. Moim zdaniem wydzielenie kontrolerów do osobnej dll zwiększa przejrzystość kodu, a z obszarami jeszcze bardziej.
Areas pozwalają na rozbicie aplikacji na obszary. Każdy z obszarów będzie miał swój zestaw kontrolerów, widoków i routing. Wszystkie obszary mogą nadal korzystać z katalogu Shared, nadal możemy mieć główny obszar (ten który był dostępny do tej pory).
Dodanie obszaru jest proste:


public class SomeNewAreaAreaRegistration : AreaRegistration { /// unikalna nazwa obszaru, wykorzystywana do nawigacji public override string AreaName { get { return "SomeNewArea"; } } /// rejestrujemy routing dla danego obszaru /// nie ma domyślnego kontrolera, jednak możemy go bez problemu dodać public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "SomeNewArea_default", "SomeNewArea/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ,new string[]{"Controllers.SomeNewArea"} ); } }W obszarach mogą powtarzać się nazwy kontrolerów, jednak jeśli w tej chwili dodamy sobie do obszaru SomeNewArea kontroler Home dostaniemy błąd ponieważ defaultowy routing nie będzie wiedział gdzie szukać. Musimy mu więc powiedzieć

public static void RegisterRoutes(RouteCollection routes) { 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 string[]{"Controllers"} ); }Teraz możemy dostać się wszędzie wpisując adres, jednak jeśli przejdziemy do obszaru SomeNewArea przestanie działać menu - a to dlatego że obecny zapis menu wskazuje na linki w tym tym samym obszarze a nie obszarze głównym tak jakbyśmy się tego spodziewali.
Musimy dołączyć informacje o obszarze. Jeśli chcemy się dostać do 'głównego' obszaru nazwę pozostawiamy pustą.
Komentarze
Prześlij komentarz