3. diel - Úvod do MVC architektúry v ASP.NET Core
V predchádzajúcej lekcii, Úvod do webových aplikácií v ASP.NET, sme si urobili úvod do webových aplikácií.
Ak čítate túto lekciu, rozhodli ste sa naučiť sa technológiu ASP.NET Core MVC.
Hoci je v ASP.NET Core viac možností, ako aplikáciu vytvoriť, začneme tou najpopulárnejšou, ktorou je MVC. Ide o veľmi obľúbený architektonický vzor, ktorý sa uchytil najmä na webe, hoci pôvodne vznikol na desktopoch. Je súčasťou populárnych webových frameworkov, akými sú okrem ASP.NET Core MVC napr. Zend alebo Nette pre PHP a Ruby On Rails pre Ruby. Osobne si bez neho (alebo nejakého podobného princípu) nedokážem predstaviť zložitejší web.
Motivácia
Základnou myšlienkou MVC architektúry je oddelenie logiky od výstupu. Rieši teda problém tzv. "špagetového kódu", kedy máme v jednom súbore (triede) logické operácie a zároveň renderovanie výstupu. Súbor teda obsahuje databázové otázky, logiku (C# kód) a rôzne rozhádzané HTML tagy. Všetko je zamotané ako špagety.
Kód sa samozrejme zle udržiava, nieto ešte rozširuje. Je zle highlightovaný, pretože si s ním IDE nevie rady, HTML nie je správne naformátovaný, strácame sa v jeho stromovej štruktúre. Našim cieľom je, aby zdrojový kód s logikou vyzeral ako zdrojový kód v C# a výstup vyzeral ako HTML stránka s čo najmenšou prímesou ďalšieho kódu.
Komponenty
Celá aplikácia je rozdelená na komponenty 3 typov, hovoríme o Modeloch, View (pohľadoch) a Controlleroch (kontroléroch), toho MVC. Označeniu pohľad sa budem snažiť vyhýbať, pretože mi príde mätúce, že takto preložené nekorešponduje s označením V. Neexistuje žiadna striktná definícia architektúry a tak sa môžete stretnúť s viacerými výkladmi. My sa zameriame na ten najrozšírenejší.
Poďme si jednotlivé komponenty najprv popísať.
Model
Model obsahuje logiku a všetko, čo do nej
spadá. Môžu to byť výpočty, databázové dopyty, validácia a podobne. Pre
nás to znamená, že modely sú klasické C# triedy, ako sme ich poznali
doteraz. Model vôbec nevie o výstupe. Jeho funkcia spočíva
v prijatí parametrov zvonku a vydaní dát von. Zdôraznime, že parametrami
nemyslíme URL adresu ani žiadne iné parametre od používateľa, ale
parametre metód v triede modelu. Model nevie, odkiaľ dáta v
parametroch prišli a ani ako budú výstupné dáta sformátované a
vypísané.
V kurze budeme používať Entity Framework Core, modely potom priamo
korešpondujú s databázovými tabuľkami. Máme teda model User,
Comment alebo Article. Inštancie modelov obsahujú
samozrejme vlastnosti z databázy. Napr. inštancia modelu User má
vlastnosť Name. Triede môžeme definovať inštančné metódy,
napr. takú, ktorá vypočíta vek používateľa podľa jeho dátumu
narodenia.
Teraz máme predstavu, čo model vykonáva, poďme sa pozrieť na pohľad.
View
Pohľad (View) sa stará o zobrazenie výstupu
používateľovi. Jedná sa o HTML šablónu,
obsahujúcu HTML stránku a tagy špeciálneho jazyka, ktorý
umožňuje do šablóny vkladať premenné, prípadne vykonávať iterácie
(cykly) a podmienky. Pohľad User.cshtml teda vypíše detaily o
používateľovi, pohľad Article.cshtml vypíše obsah
článku.
Pohľadov máme mnoho, napr. pre funkcionalitu s entitou používateľa:
Registration.cshtml, Login.cshtml,
Profile.cshtml a podobne. Pohľad Profile.cshtml je
ale už spoločný všetkým používateľom a sú do neho posielané rôzne
dáta, vždy podľa toho, koho práve zobrazujeme. Tieto dáta sú potom
dosadené do HTML elementov šablóny.
Šablóny je možné samozrejme vkladať do seba, aby sme sa neopakovali (šablóna s layoutom stránky, šablóna s menu a šablóna s článkom).
View nie je len šablóna, ale zobrazovač výstupu. Obsahuje teda minimálne množstvo logiky, ktorá je pre výpis nutná (napr. kontrola, či si používateľ vyplnil prezývku pred jej vypísaním alebo cyklus s komentármi, ktoré sa vypisujú).
View podobne ako Model vôbec nevie, odkiaľ dáta prišli, stará sa len o ich zobrazenie používateľovi.
Controller
Controller je teraz ten chýbajúci prvok, ktorý osvetlí
funkčnosť celého vzoru. Jedná sa o akéhosi prostredníka,
s ktorým komunikuje používateľ, model aj view. Drží teda celý systém
pohromade a komponenty prepája. Jeho funkciu pochopíme z
ukážky životného cyklu stránky. Najčastejšie má každá entita jeden
controller, máme teda UserController,
ArticleController a tak podobne.
Životný cyklus stránky
Životný cyklus zahajuje používateľ, ktorý
zadá do prehliadača adresu webu a parametre,
ktorými nám oznámi, ktorú podstránku si praje zobraziť. Budeme chcieť
zobraziť detail používateľa s id 15. Urobme si ukážku URL
adresy:
http://www.domain.cz/User/Detail/15
Požiadavku ako prvý zachytí tzv. router. Ten podľa parametrov pozná, ktorý controller voláme.
Daný controller podľa parametrov pozná, čo sa od neho chce, teda že má zobraziť detail používateľa. Zavolá model, ktorý používateľa vyhľadá v databáze a vráti jeho údaje. Ďalej zavolá ďalšiu metódu modelu, ktorá napr. vypočíta vek používateľa. Tieto údaje si controller ukladá do premenných. Nakoniec vyrenderuje view (pohľad). Názov pohľadu spoznáme podľa akcie, ktorú vykonávame. View sú odovzdané premenné s príslušnými dátami. Controller teda poslúchol používateľa, obstaral podľa parametrov dopytu dáta od modelu a odovzdal ich view.
View prijme dáta od controllera a vloží ich do
pripravenej šablóny. Hotová stránka je zobrazená používateľovi, ktorý
často o celej tejto kráse ani netuší 
Celú situáciu môžeme znázorniť diagramom:

Získali sme teda oddelenie logiky od výstupu, view sú ako v HTML, modely zas v C#. Dosiahli sme prehľadnosť kódu, ktorý je logicky rozčlenený.
MVC architektúra nám uľahčuje aj myslenie pri vývoji projektu. Keď píšem logiku, patrí do modelu, formátovania a štýlovania výstupu riešim v šablóne, to čo používateľ chce z parametrov zisťujem v controlleri. 3 rôzne problémy na 3 rôznych miestach, oddelené tak, aby do seba nezasahovali a nerobili nám vývoj zložitejším.
ASP.NET MVC vs ASP.NET Core
ASP.NET (rovnako ako celý pôvodný .NET Framework) je spravovaný spoločnosťou Microsoft a ako taký bol dlho cielený len na operačný systém Windows. Keďže však často potrebujeme, aby naša stránka mohla bežať aj pod iným OS bez ďalšej zbytočnej práce (napr. kvôli hostingu), toto obmedzenie bolo pre vývoj v .NETe pomerne limitujúce. K tomu sa ešte pridali ďalšie nevýhody oproti iným jazykom, napr. že .NET Framework nie je open source.
Preto sa Microsoft pred pár rokmi rozhodol framework oživiť a prepísať. Výsledkom je nový high-level framework .NET Core. Ten je multiplatformový, open source a prináša aj niekoľko ďalších výhod, spomeniem napr. vstavanú DI (Dependency Injection), lepší výkon ako pôvodný ASP.NET alebo možnosť mať viac verzií frameworku na jednom stroji naraz. Core bol tiež prepísaný tak, aby používal modernejšiu architektúru.
Dočasnou hlavnou nevýhodou Coru je, že hoci má veľa spoločného so starším .NETom a podporuje všetky súčasti .NET štandardu, niektoré veci z .NETu v Core zatiaľ nenájdeme (a tiež naopak). Ak teda plánujete iba rozširovať už existujúcu, staršiu aplikáciu, bude mať väčší zmysel naučiť sa radšej pôvodný ASP.NET MVC, ktorý je navyše dnes po rokoch vývoja o niečo ucelenejší. Nie všetky balíčky/knižnice tretích strán sú dostupné pre Core.
Momentálne obe technológie existujú a vyvíjajú sa vedľa seba, obe budú ešte nejaký čas podporované, takže nie je dôvod, aby sme nepracovali s novším ASP.NET Core.
V nasledujúcej lekcii, Prvá webová aplikácia v ASP.NET Core MVC, si vytvoríme svoju prvú webovú aplikáciu v ASP.NET Core MVC.
