Autor wpisu: batman, dodany: 09.03.2011 08:00, tagi: php
Zgodnie z obietnicą dzisiaj zajmiemy się warstwą prezentacyjną ASP.NET MVC, czyli widokiem. Do czasu wydania trzeciej wersji ASP.NET MVC sprawa była prosta. Mieliśmy jeden mechanizm odpowiedzialny za renderowanie widoku i musieliśmy się go trzymać. Wprawdzie można było napisać własny mechanizm widoku, jednak podobnie jak w Zend Frameworku mija się to z celem. Napisałem mieliśmy, ponieważ wraz z premierą ASP.NET MVC 3, ukazał się nowy silnik widoków o nazwie Razor, oferujący jeszcze więcej możliwości.
Widok ASPX
Zaczniemy od “starego” silnika, czyli ASPX, znanego z klasycznego ASP.NET. W silniku tym dane przekazujemy poprzez obiekt ViewData, posiadający typ ViewDataDictionary. Obiekt typu ViewDataDictionary można porównać do tablicy asocjacyjnej znanej z PHP. Dla zadanego klucza przypisywana jest wartość. Zobaczmy jak to działa na przykładzie. W kontrolerze przypisujemy wartość do klucza.
public ActionResult Index() { ViewData["klucz"] = "wartość"; return View(); }
A w widoku wyświetlamy jego zawartość.
<div> <%= ViewData["klucz"] %> </div>
Jak widzimy “na załączonym obrazku”, wyświetlanie treści odbywa się dzięki czemuś, co przypomina short tag znany z PHP. Wraz z pojawieniem się czwartej wersji .NET, programiści otrzymali drugi short tag, zawierający zamiast znaku równości dwukropek. Różnica w działaniu obu short tagów jest zasadnicza. W pierwszym przypadku (znak równości) kod HTML zostanie zinterpretowany, a następnie wykonany. Nie muszę chyba pisać jak bardzo jest to niebezpieczne w przypadku treści dostarczanej przez użytkownika. Problem ten rozwiązuje zapis z dwukropkiem, który zamienia krytyczne znaki na encje HTML, przez co na ekranie wyświetli się tekst w takiej formie, w jakiej został przekazany do ViewData.
Opisany powyżej sposób sprawdza się doskonale w przypadku typów prostych. Niestety w przypadku modelu nie wiemy co znajduje się w ViewData. Jak już wspomniałem ViewData jest typem słownikowym, w którym klucz posiada typ string, a wartość object. Powoduje to, że w przypadku własnych typów musimy w widoku rzutować wartość do pożądanego typu. Na szczęście ViewData posiada specjalną właściwość nazwaną Model, która w połączeniu z typem widoku jest w stanie przechować właściwy typ obiektu.
Typowanie widoków
Warto w tym miejscu warto na chwilę się zatrzymać i poznać sposób w jaki dane trafiają do widoku. Każdy widok (jak wszystko w ASP.NET MVC) posiada swój typ. W najprostszym scenariuszu widok dziedziczy po prostu po klasie ViewPage, przez co wspomniana wcześniej właściwość Model jest niczym innym jak standardowym obiektem (typ object). Widok taki nazywany jest luźno typowanym (loosely typed).
W opozycji do luźno typowanego widoku stoi widok silnie typowany (strongly typed), który również dziedziczy po klasie ViewPage, przy czym klasa ta jest klasą generyczną, gdzie typem jest nasz model. W takim widoku mamy dostęp do “prawdziwej” klasy wraz z całym dobrodziejstwem inwentarza.
Trzecim sposobem jest skorzystanie z nowego typu dostępnego od .NET 4 – dynamic jako typu w generycznej klasie ViewPage. Sposób ten pozwala na dostęp do właściwości i metod modelu w czasie wykonywania (tak jak w PHP).
Korzystanie z modelu
Jeśli mamy zdefiniowaną klasę modelu, możemy przekazać ją do widoku na dwa sposoby. Pierwszy znamy już z wcześniejszego opisu – jako właściwość Model obiektu ViewData.
Załóżmy następujący model.