
Autorem článku je Petr Stříbný. Programátor. Věnuje se internetovým stránkám, technologiím, jazykům C# a PHP. Při přípravě na maturitu sepsal některé maturitní otázky na web. Kromě toho si píše osobní blog.
Zařazení článku
Naše projekty
Co je MVC?
Zkratka
Frameworků podobného zaměření již dneska existuje více než dost, zejména pro PHP. Dnes se však budeme věnovat platformě ASP.NET, proto je třeba zmínit první a donedávna jedinný MVC framework pro ASP.NET - Monorail. Nemůžu však posoudit jeho kvality, neboť jsem v něm zatím nikdy nedělal.
Proč ale vůbec chtít nějaký MVC vzor, když tu máme WebForms?
- striktnější oddělení UI, logiky a dat
- nastavitelnost (jednoduše lze např. změnit tvar URL adres)
- lepší testovatelnost kódu
Proč se rozhodl Microsoft vytvořit vlastní implementaci? A jak je to vůbec s budoucností WebForms? Tak vlastní ASP.NET MVC vzniklo podle mě hlavně na základě poptávky. Vývojáři zkrátka tento model chtějí a Monorail je toho důkazem. Co se týče WebForms - nebude se měnit vůbec nic. ASP.NET MVC bude "pouze" alternativa, navíc převezme z WebForms některé věci, jako např. používání komponent (omezeně), způsob lokalizace či MasterPages. Nikdo nikoho do nového frameworku nebude nutit, navíc, pokud máte již v ASP.NET napsanou větší aplikaci, těžko ji budete hned přepisovat.
Co je pro to potřeba?
Jelikož je MVC Toolkit nadstavbou .NETu 3.5, je potřeba ho nainstalovat. Zároveň je skoro nutností použít nové verze Visual Studia 2008. Pro plnou podporu vývoje MVC aplikací je potřeba min. verze Standard, kvůli potřebě dvou projektů v jedné solution (jeden pro samotnou aplikaci, druhý pro testování). Jelikož ne každý disponuje patřičnou licencí nebo je pro něj plné VS 2008 příliš pomalé, dá se nové ASP.NET MVC vyzkoušet i v Express verzi Visual Studia. Pro jednoduchost přikládám odkaz na hotový projekt, abyste nemuseli nic nastavovat (majitelé vyšších verzí mají možnost založit MVC projekt přímo z menu Visual Studia).
- 1) stáhnout a nainstalovat .NET 3.5
- 2) stáhnout a nainstalovat Microsoft ASP.NET 3.5 Extensions Preview
- 3) stáhnout a nainstalovat MVC Toolkit (není nutné, ale vhodné)
- pro Express verze VS doporučuju ještě tento template nebo návod
Začínáme
Typický MVC projekt můžeme rozdělit na tři části:
- Modely, které definují datové objekty a starají se o přístup k samotným datům (mapování na databázi apod.),
-
Controllery, které jsou stavebním kamenem aplikace a řídí její logiku. Controller (řadič) zpracovává
jemu určené příchozí požadavky, používá modely a výsledná data předává pohledům. Využívá k tomu tzv. akce, jinak
řečeno metody. Příkladem takového controlleru může být např. třída
Article, jejíž akce budouNew,Showa třebaDelete. - A pohledy (views), což jsou šablony, které rozhodují o tom, jaký bude výsledný výstup (ať už se bude jednat o HTML, XML či něco jiného).
Většinou se pak takový projekt rozdělí do stejně pojmenovaných složek.
Routování, cesty
Základní změnou používání MVC vzoru je změna filosofie URL adres. Ty dříve odkazovaly na fyzické soubory, nově se definují tzv.
cesty (routes). Tyto cesty pak rozhodují o tom, který controller a která akce tohoto controlleru bude požadavek zpracovávat. Cesta je definována určitým
výrazem, vypadajícím např. takto: [controller]/[action]/[id]. Pokud bude URL vypadat "Article/Delete/2", pak to znamená, že se zavolá
akce Delete controlleru Article, která dostane jeden parametr - id (článku, který se má smazat).
Takových cest si můžete definovat více. Definice cest se provádí v metodě Application_Start v souboru Global.asax. Příklad:
RouteTable.Routes.Add(new Route { Url = "Default.aspx", Defaults = new { controller = "Home", action = "Index", id = (string)null }, RouteHandler = typeof(MvcRouteHandler) }); RouteTable.Routes.Add(new Route { Url = "[controller]/[action]/[id]", Defaults = new { action = "Index", id = 1}, RouteHandler = typeof(MvcRouteHandler) });
Všimněte si, že tyto cesty neobsahují žádnou příponu. Tato výhoda jde ruku v ruce s využitím možností IIS 7 a pro starší verzi je nutné
příponu použít (např. .mvc). Možná by to šlo i bez ní, ale bylo by asi třeba nějak do IIS 6 zasáhnout.
Také stojí za zmínku použitá syntaxe C# verze 3. Samozřejmě je možné tento kód přepsat i do nějakého staršího zápisu, tento je nicméně dost elegantní.
Url určuje ke kterému tvaru URL se daná cesta vztahuje, Defaults pak výchozí hodnoty parametru této cesty (těch v hranatých závorkách), případně
přímo specifikuje controller a akci. Nakonec skrze RouteHandler nastavíme používání třídy Web.Mvc.MvcRounteHandler. Je totiž možné použít cesty i pro aplikace nevyuživající MVC (cesty jsou v zásadě
takový připravený HttpHandler).
Tvar cest může být libovolný a je možné ho později jednoduše měnit. Ten první v našem příkladů se stará o homepage, druhý pak o výchozí mapování. Několik dalších příkladů, jak by mohla cesta vypadat:
- Archive/[Rok]/[Mesic]/[Den]
- Blog/[Uzivatel]/Posts/[Kategorie]/[NazevClanku]
- [controller]/Show/[action]/[parametr]
Controllery
Ukažme si nyní, jak vypadá controller. Stačí podědit třídu Controller, přičemž metody označíme příznakem [ControllerAction]:
namespace Controllers { public class AdminController : Controller { [ControllerAction] public void Index() { RenderView("Index"); } [ControllerAction] public void ListUsers(int page) { ViewData.Add("Users", users); RenderView("ListUsers"); } } }
Jako ukázku jsem zvolil controller pojmenovaný Admin, který má dvě akce - Index (výchozí) a ListUsers (s
parametrem page pro stránkování). Pokud se podíváme na výše uvedené cesty, zjistíme, že pro zobrazení výpisu uživatelů nám stačí zadat
do prohlížeče URL "/Admin/ListUsers" (Admin jako jméno controlleru, ListUsers jako jméno akce), případně specifikovat stránku "/Admin/ListUsers/3". Stránku nemusíme zadávat, protože v definice cesty jsme
nastavili výchozí hodnotu parametru id na 1. Samotné mapování cesty na akci controlleru a předání všech dalších parametrů už funguje
zcela automaticky.
Zavoláním metody RenderView() vyrenderujeme výstup, přičemž specifikujeme který pohled se má použít. Všechny pohledy patřící k danému
controlleru jsou umístěné ve složce "Views/jméno controlleru". Název pohledu pak většinou koresponduje s názvem akce (jako u našeho ListUsers).
Předání dat pohledu je uskutečněno pomocí objektu ViewData - který funguje jako slovníkové pole klíč/hodnota (string/object). S těmito daty lze
pak v pohledu jednoduše pracovat.
Pohledy
Pohledy jsou templatové soubory s příponou .aspx. Je možné spolu s něma používat code behind podobně jako ve WebForms, ale není to příliš elegantní a nevím jak hodně to zapadá do konceptu MVC. Pohledy můžou využívat MasterPages, zobrazovat komponenty, ale hlavně jsou vybavené tzv. pomocníky (helpery), kteří ušetří spoustu práce při formátování dat. Některé budou poskytnuty tzv. out of the box, ostatní si můžete napsat sami.
Ukažme si jak by mohl vypadat náš pohled ListUsers (předpokládejme, že předaný objekt Users je typu MembershipUserCollection):
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewPage" Title="Users"%>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
<h1>Users</h1>
<table>
<% MembershipUserCollection users = (MembershipUserCollection)ViewData["Users"]; %>
<% foreach (MembershipUser user in users) { %>
<tr><td><%= user.UserName %></td><td><%= user.Email %></td><td><%= user.CreationDate %></td></tr>
<% } %>
</table>
<%= Html.ActionLink("Další stránka", new { Controller = "Admin", Action = "ListUsers", id = 2 }) %>
</asp:Content>
Tento pohled je opravdu velice jednoduchý, ale pro názornost jistě postačí. Kromě výpisu uživatelů jsem do něj zařadil ještě použití helperu, který vytvoří odkaz na určitou akci s parametry. Vytvářet odkazy touto cestou přináší výhodu v tom, že i při změně cest nám zůstanou odkazy v aplikaci funkčí. V tomto případě máme odkaz na další stránku, tedy na "/Admin/ListUsers/2".
Jinak je zdrojový kód velice podobný klasickému WebForms souboru - obsahuje definici jazyka, MasterPage, titulek, mění se akorát parametr Inherits.
K výpisu se používá kombinace jazyka C# a známých snippetů <% %>.
Závěr, zdroje
ASP.NET MVC je evoluce v programování na platformě ASP.NET. Spojuje TDD, přísné oddělení vrstev, praktické mapování adres a bohatost .NET frameworku. Pro mnoho lidí určitě dost dobrý důvod, aby se tomuto frameworku začali věnovat. Je však potřeba si uvědomit, že ASP.NET MVC není hotový a že i klasický WebForms model má spoustu výhod.
Článek jsem psal pro ASP.NET programátory, kteří ještě neměli čas si o MVC něco přečíst. Rád si přečtu vaše názory na ASP.NET MVC nebo kritiku článku v diskuzi. Je jasné, že popsat jedním článkem tak rozsáhlou věc není možné. Například jsem úplně vynechal testování, protože nejsem ten pravý, který by o nich měl psát. Závěrem už jen pár zahraničních a českých souvisejících článků:
- Redakční systém na ASP.NET MVC od rarouše
- ASP.NET MVC Quickstart
- Oficiální fórum ASP.NET MVC
- Série článků od Scotta Guthrieho
- Agregátor článků o ASP.NET MVC od rarouše
Článek publikován 2007-12-26 05:23:30.




Komentáře
MVC se dostalo do povědomí zejména s příchodem frameworku Struts (prvně vydán 05/2000 oproti RoR 07/2004).
V suvislosti so vzorom MVC by som chcel upresnit, ze tento vzor sa nespopularizoval s prichodom Ruby on Rails. Tento vzor je dlho znamy a pouzivany v Java komunite. Je zakladom napr. web frameworku Struts.
Ano možná je poprvé masově používán od doby frameworku Struts, to ale podle mě není „širší povědomí“. V posledních letech bylo MVC popularizováno zejména RoR komunitou.
Java-isti mají jistě jasno, ale Javu na webu moc neuvidíte a když už, tak se jedná o profesionální aplikaci(nic jednoduchého) psanou profesionálním programátorem, nikoliv poloprofesionálním „lepičem webů“, kterých je nejvíc a u kterých vítězí trošku jiné postupy – majíce právě tu sílu opravdu masově prosadit určitou technologii/vzor. I když…přijde mi i tak trochu paradoxní, že tomu pomohlo právě ruby – tenkrát skoro mrtvý jazyk s velice problematickou nabídkou hostingů, tzn. nic pro začátečníky…možná to PR bylo tak kvalitní, ale díky bohu za něj :)
To je tak. Javista by tak zcela ignoroval, kdyby v .NETu teď vznikl nějaký architektonický vzor a tvrdil by že byl zpopularizován až co se objevil v Javě ;-). Například ve zmiňovánem PHP se MVC začíná popularizovat teprve teď s příchodem Zend Frameworku. I když uznávám, že kolem RoR je teď asi vetší humbuk, než kdy byl kolem Struts frameworku.
No konečně, možna se konečně podívám na programování webu pod .NET, uplně jako by to z oka vypadlo Zend Frameworku, ktery znam, hlavně ten router, ale ta nova syntaxe je pro jazyk jako C# dost priserna, new Route {… } vypada fakt dost divne, jak tak vidim, tak se z C# za chvili stane hybridem neco mezi Javou a Ruby/Pythonem. Pouzivat C# v šablonach je asi dost opruz, tam by to opravdu chtělo něco dynamičtějšího.
ATom: s tím Zendem bych si dovolil trošku nesouhlasit. MVC frameworky byly v php používány masově už před Zendem a momentálně je prý CakePHP i Symfony používán víc než Zend…vzhledem k tomu, že jsou oba starší a už dávno v produkčním stavu bych tomu i věřil…
Konec konců je docela jedno, kdo myšlenku MVC na webu přinesl a/nebo kdo ji zpopularizoval. Důležité je, že v poslední době se jedná o jasně majoritní směr tvorby webů. Svoje zástupce má MVC ve většině využívaných technologií: PHP – CakePHP, Zend; Python – TurboGears, Django; Java – nevím s tou se zatím moc nebavím a teď i ASP.NET. Je to dobře, myslím si, že by do několika let mohli odpadnout všechni ti „weboví programátoři“ a na www by konečně začala pronikat spíše kvalita než kvantita.
Nikdo jste nikdy neprogramoval s MFC? Nikdo jste nikdy nezavadil o nextstep ci jeho derivaty?
Lojza: Myslím, že tyhle pojmy každému „něco“ říkají, ale na to aby jsme v tom něco intenzivněji dělali jsme asi příliš mladí:-)
Lojza: v MFC jsem neco delal (bohuzel), ale jejich architektura dokument-pohled je podle me jina nez MVC, jak ho znam treba ze Smalltalku. Chybi mi tam ten koncept Cotroller.
Díky za pěkný článek, o MVC jsem doteď moc nevěděl (dělám v klasických webforms v ASP.NET), ale tato technika mne hodně zaujala. Začínám teď nový projekt a rozmýšlím nad tím, zda jít do MVC či nikoliv… S MVC budu muset strávit ještě pár večerů, abych mu přišel na chuť a pak se uvidí :)
Napsat komentář
Upozornění: komentáře jsou schvalovány!