sobota, 10 września 2011

ASP.MVC 3 Nowości w kontrolerach

Swój cykl postów związanych z omówieniem nowości w ASP.NET MVC 3 rozpocznę od kontrolerów. Kontroler to jak wiadomo warstwa pośrednia między modelem a widokiem.
Można sobie go wyobrazić jako potężna centrala telefoniczna, która przekazuje połączenia w odpowiednie miejsca.

1. Globalne filtry
Z filtrami w ASP.NET MVC 2 spotkaliśmy się nie raz. Są to bardzo przydatne narzędzia pozwalające oddzielić często powtarzające się czynności od logiki metod/kontrolera. Dzięki temu kontroler za pomocą akcji spełnia swoje zadania, a elementy takie jak identyfikacja, cache itp. nie "zaciemniają kodu".
W wersji MVC 2 mogliśmy nakładać filtry na pojedyncze akcje czy kontrolery:



Code:
    [Authorize(Roles="Admin")]
    public class HomeController : Controller
    {
        [OutputCache(Duration=10, VaryByParam="None")]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }

Rozwiązanie bardzo przydatne i intuicyjne. Co jednak jeżeli chcemy jeden filtr nadać dla wszystkich kontrolerów?

Aby rozwiązać ten problem wprowadzono tzw. globalne filtry. Filtry te definiujemy w pliku Global.asax w metodzie RegisterGlobalFilters:

Code:
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }


2. ViewBag
ViewBag to nowa właściwość za pomocą której możemy przesyłać dane do widoku. Zobaczmy na przykład tworzony wraz z nowym projektem aplikacji:


Code:
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

W porównaniu z właściwością ViewData - ViewBag jest typu dynamic, co w uproszczeniu oznacza że nie jest sprawdzane co znajduje się pod taką zmienną podczas kompilacji ale podczas wykonywaniu programu. W przypadku MVC 3 możemy korzystać z obu możliwości w zależności od naszych preferencji.


3. Caching rezultatu akcji
MVC 3 wprowadza nowość w postaci możliwości caschowania rezultatów wykonania akcji. Zobaczmy na przykład:
Code:
        [OutputCache(Duration=4000, VaryByParam="idCategory")]
        public ActionResult ProductList(int idCategory)
        {
            var q = db.GetProductsByCategories(idCategory);

            return PartialView(q);
        }

Mając do czynienia z np. stroną na której wyświetlamy produkty z danej kategorii, które nie zmieniają się np. na bieżąco tylko są dodawane raz dziennie, stosujemy caschowanie rezultatu. Rezultat jest zatem zapamiętany i nie będzie potrzeby odwoływania się do bazy danych po każdym requescie użytkownika. Dla np. 5 kategorii odwołanie do bazy nastąpi przykładowo 5 krotnie a następne po 4 tysiącach sekund.
Rozwiązanie bardzo przydatne, odciążające serwer, przyspieszające zarazem działanie całej aplikacji.


4. Nowe typy rezultatów akcji:
W nowej odsłonie MVC wprowadzono 3 nowe typy rezultatów:

HttpNotFound - przydatny w przypadku kiedy użytkownik chce się dostać do zasobu którego nie ma - np. poprzez ręczne sterowanie parametrami przekazywanymi do akcji kontrolera. Jest to oczywiście kod odpowiedzi na błąd 404.
RedirectResult - odpowiednik błędu 302, co jest bardzo ważne w przypadku SEO HttpStatusCodeResult - umożliwia zwrócenie kodu błedu 5.


5. Filtry na akcjach wykonywane przed tymi na kontrolerach 
Poprzednio w MVC 2 należało być szczególnie ostrożnym podczas nakładnia filtrów na kontrolery. Powodem tego było, że jeżeli na akcję nakładany był filtr a później na cały kontroler inny filtr mogło dojść do niezamierzonej sytuacji, że filtr na kontrolerze uniemożliwiał dostanie się do żądanej akcji, chociaż była ona pierwotnie dozwolona.
Jeżeli nie chcemy korzystać z nowej funkcjonalności wystarczy nadać odpowiednią kolejność filtrom.


6. Sessionless controlers
Jak wiadomo nadzorowanie sesji nie jest rzeczą prostą a wręcz może prowadzić do spowolnienia działania witryny. Jeżeli weźmiemy pod uwagę, że ta sama przeglądarka próbuje wysłać kilka requestów do serwera, na czas przetwarzania każdego z nich sesja musi zostać zablokowana. MVC 3 wprowadza możliwość wyboru w jaki sposób ma być traktowany obiekt sesji. Możemy wybrać spośród 4 trybów:
- Default
- Disabled - wyłączona
- ReadOnly - tylko do odczytu
- Required - zapis i odczyt


Jak widać nowe MVC 3 wprowadza szereg nowości i unowocześnień. Przechodząc na nową wersję frameworka warto je stosować i nie bać się eksperymentów z nimi. W końcu jeżeli mają pozostać tylko wiedzą "merytoryczną" nie warto przechodzić do nowej technologii.

Brak komentarzy:

Prześlij komentarz