ASP.NET MVC

Součástí nedávno vydaných extenzí pro ASP.NET 3.5 je mimo jiné i ASP.NET MVC, dlouhodobě očekavaný nový framework pro budování webových aplikací.


Petr Stříbný

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

Aplikace ASP.NET C# Programování

Naše projekty

Angličtina AGJ.cz
Dějepis


Co je MVC?

Zkratka MVC označuje návrhový vzor (nebo spíše architektonický vzor; podle Wikipedie), který se snaží přísně oddělit logiku aplikace, uživatelské rozhraní a datový model aplikace. I když byl poprvé popsán roku 1979, do širšího povědomí se dostal až s příchodem webových aplikací, zejména s rozšířením frameworku Ruby on Rails.

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?

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).

Začínáme

Typický MVC projekt můžeme rozdělit na tři části:

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:

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ů:

Článek publikován 2007-12-26 05:23:30.


Linkovat Přidat odkaz na del.icio.us

Komentáře

MVC se dostalo do povědomí zejména s příchodem frameworku Struts (prvně vydán 05/2000 oproti RoR 07/2004).

dejv

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.

NMarian

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.

Petr Stříbný

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 :)

sh

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.

ATom

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.

optik

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…

sh

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.

Lukáš Pokorný

Nikdo jste nikdy neprogramoval s MFC? Nikdo jste nikdy nezavadil o nextstep ci jeho derivaty?

Lojza

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í:-)

Petr Stříbný

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.

Slune

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í :)

Vladimír Dědek

Napsat komentář

Upozornění: komentáře jsou schvalovány!




Napište prosím, kolik je 10 bez pěti:


Náhled

Nepřehlédněte

© 2005—2007 Zápisník programátorů. Veškerá práva vyhrazena.
O zápisníku — Autoři — Archív