Opiszę poniżej czego dowiedziałem się wczoraj i postaram się tym samym wprowadzić w MVC tych, którzy nie mieli jeszcze z tym do czynienia.
Ja osobiście z modelem MVC miałem do czynienia już wcześniej gdy pisałem jeszcze w PHP używając Zend Frameworka.
Po pierwszym spotkaniu z MVC w ASP.NET wydaje mi się przyjemniejszy niż w Zendzie.
- Co to znaczy MVC?
- To znaczy Model, View, Controller
- Co oznaczają te słowa?
- Oznaczają to że całą stronę dzielimy na 3 części. Poruszanie się po stronie nie przypomina już odwoływania się do kolejnych plików i renderowania ich zawartości.
- Więc jak to działa?
- Można sobie wyobrazić tak, że wszystkie żądania naszej strony (obojętnie czy wchodzimy na stronę główną czy jakąś tam inną stronę "kontakt", "portfolio" czy jakąkolwiek inną) przechodzą przez zawsze ten sam punkt, który decyduje co robić dalej. (mechanizm trasowania)
- Po co to?
- Żeby ułatwić sobie pracę przy utrzymywaniu i rozbudowaniu serwisu. Dzięki stosowaniu kilku zasad i rozdzieleniu strony na moduły można łatwiej nią zarządzać. Wszystko jest poukładane dzięki rozdzieleniu strony na Modele, Widoki i Kontrolery.
- Co to jest Model?
- Jest to zestaw klas opisujących dane, na których pracuje aplikacja. Wszystko co związane z dostępem do danych oraz ich modyfikacji (reguły biznesowe).
- Co to jest Widok?
- Jest tym co widzi użytkownik. Jest częścią odpowiedzialną tylko i wyłącznie za pokazywanie wyników, przetworzonych danych, które otrzymał do wyświetlenia. No i oczywiście za wszystkie bajery które użytkownik widzi i może wchodzić z nimi w interakcję (interfejs użytkownika).
- Co to jest Kontroler?
- Jest to zestaw klas, który ma za zadanie łączenie modelu i widoku. Odpowiada za przepływ działań w aplikacji.
"Teoretyczny przykład"
- Wchodzę na swoją stronę np jakaśstrona.pl/projekty/asp/10
- Co "zobaczy" ASP.NET MVC ? Coś takiego:
- Znajdź kontroler projekty
- Znajdź metodę asp
- Prześlij do niej parametr 10 co odpowiada wyświetleniu 10tego (np jakiegoś fikcyjnego) projektu
Kontrolerem jest jakaś klasa, która zawiera metody. Wpisując taki adres jak wyżej, zostaje on rozpoznany przez mechanizm trasowania i znajdowany jest właśnie ten jeden określony kontroler i z niego wywoływana jest metoda (do której przesyłany zostaje parametr będący na samym końcu adresu).
W wyniku wykonania tej metody, jej rezultat przesyłany jest do widoku który wyświetla tylko już gotowe przesłane do niego wyniki.
Oczywiście wewnątrz metody kontrolera mogą wystąpić odwołania do modelu, który np mógłby pobierać coś z bazy danych. Model możemy wyobrazić sobie jako klasę która reprezentuje jakąś tabelę w bazie danych. Chcąc pobrać coś z bazy wywołujemy jedynie metodę modelu. Cała logika odpowiadająca za połączenie z bazą i zapytania SQL zawiera się właśnie wewnątrz tej klasy/jej metod.
Powinno być już tutaj bardziej widać podział na 3 części.
"Praktyczny przykład"
Nie owijając dalej w bawełnę, pokażę jak "ruszyć" pierwszy projekt MVC.
Od teraz zakładam że każdy wie jak utworzyć projekt i dodawać do niego istniejące lub nowe pliki ;)
Odpalamy VisualStudio,
Tworzymy nowy projekt, o taki:
Ponieważ nie chcemy (jeszcze) robić testów jednostkowych, w następnym oknie zaznaczamy
Po utworzeniu projektu i odpaleniu go (F5) zobaczymy szkielet strony. Klikając w "About" zobaczymy, że pasek adresu w przeglądarce zmienił się na mniej więcej taki: http://localhost:50843/Home/About.
Tak jak pisałem wcześniej: Wyszukiwany jest kontroler Home i wykonywana jest jego metoda About.
Sprawdźmy czy aby na pewno.
Rzućmy okiem na Solution Explorer.
Mamy foldery Models, Views, Controllers. Chyba nazwy same sugerują co należy tam umieszczać :)
Otwórzmy HomeController. Co widzimy w środku?
public ActionResult About() { return View(); }
No i mamy naszą metodę About.
Kilka uwag co do konwencji
- Wszystkie nazwy plików wewnątrz folderu Controllers muszą się kończyć na "Controller"
- W folderze Views każdy kontroler ma swój własny folder z widokami. Nazwy folderów nie zawierają już końcówki "Controller".
- W tych folderach, pliki .aspx reprezentują widoki. To one są renderowane i wyświetlane po przejściu przez metodę kontrolera.
A co z "Home"? Przecież klikając na Home nie mamy adresu http://localhost:50843/Home/Index tylko http://localhost:50843/.
Racja. Otwórzmy więc plik Global.asax.
Jest to plik w którym definiowane są "ścieżki" naszej aplikacji.
Widzimy w środku funkcję:
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 } // Parameter defaults ); }
Widać z grubsza co ona "robi".
Mamy tutaj coś takiego jak MapRoute(...). określona jest tutaj ścieżka, która zawiera w sobie najpierw nazwę kontrolera, później nazwę akcji (metody kontrolera) i parametr "id". Jak na razie nasza strona rozpoznaje tylko taki rodzaj adresu. Własnie tutaj możemy zdefiniować inne ścieżki oraz dodawać wiele innych parametrów. Dalej mamy ustawiony domyślny kontroler akcję oraz parametr, który jest pomijany. Dzięki temu po wejściu na "Home" mamy "czysty" URL.
Wróćmy do pliku HomeController.cs.
Za co odpowiada ViewData["Message"] = "Welcome to ASP.NET MVC!"; ?
Żeby się tego dowiedzieć musimy otworzyć Views/Home/Index.aspx.
Znajdziemy tam linijkę
<h2><%: ViewData["Message"] %></h2>
Widać że odwołuje się do tego samego "elementu".
ViewData jest typem ViewDataDictionary a więc jest słownikiem. Można go używać jak tablicy, do której w kontrolerze w pole "Message" przypisujemy "Welcome to ASP.NET MVC!" aby potem odczytać je w widoku. Zamiast Message możemy wpisać jakiś inny string np "komunikat" czy cokolwiek. Wiemy o co chodzi...
Odnośnie komentarza mgibas w moim wcześniejszym poście, również polecam zainteresowanie się materiałami Scotta Hanselmana. Sam się właśnie za nie zabieram. Nawet wczoraj w swojej nieszczęsnej książce do ASP.NET w rozdziale właśnie o MVC było o nim wspomniane (nawet jest on jednym z autorów oryginału tej książki), tym bardziej wzbudził moje zanteresowanie.