Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Lekce 1 - Úvod do MVC architektury v ASP.NET Core

C# .NET ASP.NET ASP.NET Core Základy ASP.NET Core MVC Úvod do MVC architektury v ASP.NET Core

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, , jsme si vysvětlili proč je dobrý nápad naší aplikaci naprogramovat jako webovou. Pokud čtete tento tutoriál, rozhodli jste se naučit technologii ASP.NET Core MVC.

Ačkoli v ASP.NET Core je více možností jak aplikaci vytvořit, začneme tou nejpopulárnější, kterou je MVC. Jedná se o velmi oblíbený architektonický vzor, který se uchytil zejména na webu, ačkoli původně vznikl na desktopech. Je součástí populárních webových frameworků, jakými jsou kromě ASP.NET Core MVC např. Zend nebo Nette pro PHP a Ruby On Rails pro Ruby. Osobně si bez něj (nebo nějakého podobného principu) nedokáži představit složitější web.

Motivace

Základní myšlenkou MVC architektury je oddělení logiky od výstupu. Řeší tedy problém tzv. "špagetového kódu", kdy máme v jednom souboru (třídě) logické operace a zároveň renderování výstupu. Soubor tedy obsahuje databázové dotazy, logiku (C# kód) a různě poházené HTML tagy. Vše je zamotané do sebe jako špagety.

Kód se samozřejmě špatně udržuje, natož rozšiřuje. Je špatně highlightovaný, protože si s ním IDE neví rady, HTML není správně naformátováno, ztrácíme se v jeho stromové struktuře. Naším cílem je, aby zdrojový kód s logikou vypadal jako zdrojový kód v C# a výstup vypadal jako HTML stránka s co nejmenší příměsí dalšího kódu.

Komponenty

Celá aplikace je rozdělena na komponenty 3 typů, hovoříme o Modelech, View (pohledech) a Controllerech (kontrolerech), od toho MVC. Označení pohled se budu snažit vyhýbat, protože mi přijde matoucí, že takto přeložené nekoresponduje s označením V. Neexistuje žádná striktní definice architektury a tak se můžete setkat s více výklady. My se zaměříme na ten nejrozšířenější.

Pojďme si jednotlivé komponenty nejprve popsat.

Model

Komponenta model z MVC architektury Model obsahuje logiku a vše, co do ní spadá. Mohou to být výpočty, databázové dotazy, validace a podobně. Pro nás to znamená, že modely jsou klasické C# třídy, jako jsme je znali doposud. Model vůbec neví o výstupu. Jeho funkce spočívá v přijetí parametrů zvenku a vydání dat ven. Zdůrazněme, že parametry nemyslíme URL adresu ani žádné jiné parametry od uživatele, ale parametry metod ve třídě modelu. Model neví, odkud data v parametrech přišla a ani jak budou výstupní data zformátována a vypsána.

V kurzu budeme používat EntityFramework, modely potom přímo korespondují s databázovými tabulkami. Máme tedy model Uzivatel, Komentar nebo Clanek. Instance modelů obsahují samozřejmě vlastnosti z databáze. Např. instance modelu Uzivatel má vlastnost Jmeno. Třídě můžeme definovat instanční metody, např. takovou, která vypočítá věk uživatele podle jeho data narození.

Nyní máme představu, co model vykonává, pojďme se podívat na pohled.

View

Komponenta view z MVC architektury Pohled (View) se stará o zobrazení výstupu uživateli. Jedná se o HTML šablonu, obsahující HTML stránku a tagy speciálního jazyka, který umožňuje do šablony vkládat proměnné, případně provádět iterace (cykly) a podmínky. Pohled Uzivatel.cshtml tedy vypíše detaily o uživateli, pohled Clanek.cshtml vypíše obsah článku.

Pohledů máme mnoho, např. pro funkcionalitu s entitou uživatele: Registrace.cshtml, Prihlaseni.cshtml, Profil.cshtml a podobně. Pohled Profil.cshtml je ale již společný všem uživatelům a jsou do něj posílána různá data, vždy podle toho, koho zrovna zobrazujeme. Tato data jsou poté dosazena do HTML elementů šablony.

Šablony lze samozřejmě vkládat do sebe, abychom se neopakovali (šablona s layoutem stránky, šablona s menu a šablona článkem).

View není jen šablona, ale zobrazovač výstupu. Obsahuje tedy minimální množství logiky, která je pro výpis nutná (např. kontrola, zda si uživatel vyplnil přezdívku před jejím vypsáním nebo cyklus s komentáři, které se vypisují).

View podobně jako Model vůbec neví, odkud mu data přišla, stará se jen o jejich zobrazení uživateli.

Controller

Komponenta controller z MVC architektury Controller je nyní onen chybějící prvek, který osvětlí funkčnost celého vzoru. Jedná se o jakéhosi prostředníka, se kterým komunikuje uživatel, model i view. Drží tedy celý systém pohromadě a komponenty propojuje. Jeho funkci pochopíme z ukázky životního cyklu stránky. Nejčastěji má každá entita jeden controller, máme tedy UzivatelController, ClanekController a tak podobně.

Životní cyklus stránky

Životní cyklus zahajuje uživatel, který zadá do prohlížeče adresu webu a parametry, kterými nám sdělí, kterou podstránku si přeje zobrazit. Budeme chtít zobrazit detail uživatele s id 15. Udělejme si ukázku URL adresy:

http://www.domena.cz/Uzivatel/Detail/15

Požadavek jako první zachytí tzv. router. Ten podle parametrů pozná, který controller voláme.

Daný controller podle parametrů pozná, co se po něm chce, tedy že má zobrazit detail uživatele. Zavolá model, který uživatele vyhledá v databázi a vrátí jeho údaje. Dále zavolá další metodu modelu, která např. vypočítá věk uživatele. Tyto údaje si controller ukládá do proměnných. Nakonec vyrenderuje view (pohled). Název pohledu poznáme podle akce, kterou provádíme. View jsou předány proměnné s příslušnými daty. Controller tedy poslechl uživatele, obstaral podle parametrů dotazu data od modelu a předal je view.

View přijme data od controlleru a vloží je do připravené šablony. Hotová stránka je zobrazena uživateli, který často o celé této kráse ani netuší :)

Celou situaci můžeme znázornit diagramem:

MVC architektura

Získali jsme tedy oddělení logiky od výstupu, view jsou jako HTML, modely zas v C#. Dosáhli jsme přehlednosti kódu, který je logicky rozčleněný.

MVC architektura nám usnadňuje i myšlení při vývoji projektu. Když píši logiku, patří do modelu, formátování a stylování výstupu řeším v šabloně, to co uživatel chce z parametrů zjišťuji v controlleru. 3 různé problémy na 3 různých místech, oddělené tak, aby do sebe nezasahovaly a nedělaly nám vývoj složitější.

ASP.NET MVC vs ASP.NET Core

ASP.NET (stejně jako celý původní .NET framework) je spravován společností Microsoft a jako takový byl dlouho cílený jen na operační systém Windows. Jelikož ovšem často potřebujeme, aby naše stránka mohla běžet i pod jiným OS bez další zbytečné práce (např. kvůli hostingu), toto omezení bylo pro vývoj v .NETu poměrně limitující. K tomu se ještě přidaly další nevýhody oproti jiným jazykům, např. že .NET není open source.

Proto se Microsoft před pár lety rozhodl framework oživit a přepsat. Výsledkem je nový high-level framework .NET Core. Ten je nově multiplatformní, open source a přináší i několik dalších výhod, zmíním např. vestavěnou DI (Dependency Injection), lepší výkon než původní ASP.NET nebo možnost mít více verzí frameworku na jednom stroji najednou. Core byl také přepsán tak, aby používal modernější architekturu.

Prozatimní hlavní nevýhodou Coru je, že ačkoli má mnoho společného se starším .NETem a podporuje všechny součásti .NET standardu, některé věci z .NETu v Coru zatím nenajdeme (a také naopak). Pokud tedy plánujete pouze rozšiřovat již existující, starší aplikaci, bude mít větší smysl naučit se raději původní ASP.NET MVC, který je navíc dnes po letech vývoje o něco ucelenější. Ne všechny balíčky/knihovny třetích stran jsou dostupné pro Core.

Momentálně obě technologie existují a vyvíjí se vedle sebe, obě budou ještě nějakou dobu podporovány, v tutoriálu ale není důvod, abychom nepracovali s novějším ASP.NET Core. V příští lekci, První webová aplikace v ASP.NET Core MVC, si vytvoříme svou první webovou aplikaci v ASP.NET Core MVC.


 

 

Článek pro vás napsal Martin Petrovaj
Avatar
Jak se ti líbí článek?
1 hlasů
Autor je lenivý vymýšľať nejaký slušný podpis. Venuje sa ale prevažne C#.
Miniatura
Všechny články v sekci
Základy ASP.NET Core MVC
Aktivity (5)

 

 

Komentáře

Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:15. června 17:27

Proč vzniká nový seriál na ASP.NET Core MVC, když se logika nijak neliší od ASP.NET MVC, který už tu je??

Odpovědět  +2 15. června 17:27
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na patrik.valkovic
David Čápka:15. června 18:14

Logika se liší, je to napsané v článku, cituji:

Prozatimní hlavní nevýhodou Coru je, že ačkoli má mnoho společného se starším .NETem a podporuje všechny součásti .NET Standardu, některé věci z .NETu v Coru zatím nenajdeme (a také naopak). Pokud tedy plánujete pouze rozšiřovat již existující, starší aplikaci, bude mít větší smysl naučit se raději původní ASP.NET MVC, který je navíc dnes po letech vývoje o něco ucelenější. Ne všechny balíčky/knihovny třetích stran jsou dostupné pro Core

Odpovědět 15. června 18:14
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na David Čápka
patrik.valkovic:15. června 18:23

No právě že logika se neliší. Chybí tam nějaké knihovny, to jo, ale to přece nemůžeš nazvat logikou aplikace, ta je pro obě technologie stejná.

Odpovědět  +1 15. června 18:23
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na patrik.valkovic
David Čápka:15. června 18:27

Ve VS se to jinak zakládá, šablony se liší, takže se něco musí řešit manuálně, na nějaké věci se musí používat knihovny třetích stran, nějaké věci z MVC tam nejsou a asi ani nebudou. Proto dává smysl udělat tomu nový seriál, protože na tom starém to prostě udělat 1:1 nejde.

Odpovědět 15. června 18:27
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Lukáš Cach
Člen
Avatar
Lukáš Cach:15. června 18:32

Bylo by možné uživatelům, kteří mají zakoupený e-shop v ASP.NET MVC automaticky zpřístupnit i aktualizovaný kurz v ASP.NET CORE? Myslím si, že by to bylo docela fér, přeci nebyl úplně nejlevnější.

Ještě jedna otázka, jedná se o ASP.NET CORE 2?

 
Odpovědět  +1 15. června 18:32
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Cach
David Čápka:15. června 19:12
  • Nebylo by to fér, protože jak jsem psal výše, je tam hodně změn a ten nový kurz nás stál nemálo peněz. Není naše chyba, že to MS takhle hodně mění, to si vyřiď s nimi, my jen reagujeme na aktuální trendy.
  • Ano, je to dvojka
Odpovědět 15. června 19:12
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Lukáš Cach
Martin Petrovaj:17. června 19:43

Ahoj, čo sa eshopu týka, je to vlastne z väčšej časti ten istý e-shop, najviac rozdielov sa týka portu zo staršieho ASP.NET MVC (tuším že verzie) 4 do Core 2.1.

Nie je ich síce málo, niektoré zmeny môžu byť na port možno trochu náročnejšie, ale ak si prejdeš po publikácii celý tento základný seriál a vieš si potrebné veci dohľadať (hlavne v dokumentácii, niečo na SO a občas niečo z blogov alebo Coreovského githubu), určite si s tým poradíš :-)

Nový seriál s eshopom prináša hlavne to, že tieto všetky "otravné" veci už vyriešil za teba, dá ti návod ako na to, používa najmodernejšie a odporúčané postupy všade, kde sa to dá (veľa vecí od napísania pôvodného ASP.NET MVC eshopu zastaralo, zmenilo sa alebo dokonca zaniklo), naučí ťa pracovať s novými a zaujímavými featurami v Core, ktoré v pôvodnom frameworku ani nie sú a pôvodný eshop je tu a tam oproti starému seriálu ešte trochu vylepšený ;-)

Odpovědět  +1 17. června 19:43
if (this.motto == "") { throw new NotImplementedException(); }
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.