ASP.NET MVC 2

Microsoft před pár dny uvolnil další verzi ASP.NET MVC, verzi 2. V době psaní článku je dostupná verze pro Visual Studio 2008. Verze pro 2010 jakoby nebude, protože ASP.NET MVC 2 bude dodáváno přímo s Visual Studiem 2010.
Ve verzi 2 není myslím nic, co by každého, kdo trošku sleduje scénu, překvapilo. ASP.NET MVC se totiž vyvíjí pod open source licencí Ms-PL, zdrojové kódy jsou dostupné na Codeplexu a tým vždy před releasem udělá několik pracovních verzí, díky čemuž má velmi dobrý feedback od komunity a ven jde dobře otestovaná věc.
Protože ale ne každý má čas/náladu/whatever sledovat průběžně novinky v ASP.NET MVC, podíváme se v tomto článku na zoubek novinkám ve verzi 2 (vůči verzi 1).

Za dva hlavní motivy nové verze bych označil větší typovou bezpečnost (tedy konec stringovým konstantám) a lepší znovupoužitelnost kódu (DRY).

(Render)Action

Pokud jste chtěli v ASP.NET MVC 1 znovupoužít nějaký kód ve view, pravděpodobně jste vytvořili ascx soubor (partial view) a pak ho renderovali pomocí metody Html.RenderPartial. Užitečné, ale není to vhodné, pokud potřebujeme nějakou více autonomní partial view – typicky, aby partial view sosal nějaká data z Modelu. Jinými slovy, pokud nemůžeme nebo nechceme předávat data z rodičovského view do partial view a partial view si data tedy musí načíst sám.
Protože přistupovat k Modelu přímo z View je prasečina, máme tu k dispozici náhradu – metody Html.RenderAction a Html.Action. První metoda slouží k tomu, že nám vyrenderuje danou akci. Tzn. specifikujeme controller a action a ASP.NET MVC se postará o to, že se tato akce zavolá a dojde tedy k renderu. Druhá metoda, Html.Action, udělá to samé, ale výsledek volání akční metody nevyrenderuje, vrátí nám ho jako string.
Akční metody, které voláme takto přes Html.(Render)Action, se nazývají child action methods a pokud chceme zajistit, aby určitá akční metoda byla volatelná pouze takto (a ne jako klasická akční metoda), můžeme ji označit atributem ChildActionOnly.

Silně typový HtmlHelper

Pokud jsme chtěli v čistém ASP.NET MVC 1 vykreslit třeba inputítko pro nějakou property modelu (resp. view-modelu), museli jsme udělat něco jako Html.TextBox(„Price“), tedy použít stringovou konstantu. Nyní je HtmlHelper silně typový, genericky zná typ (view)modelu, což nám umožňuje nyní zapsat pěknější Html.TextBoxFor(m => m.Price).

ModelMetadata

Třída ViewDataDictionary nyní neobsahuje pouze property Model, ale také nově ModelMetadata (stejnojmené třídy), která nese informace o viewmodelu. Tato data se načítají pomocí zvoleného ModelMetadataProvideru, defaultně je to DataAnnotationsModelMetadataProvider, který používá atributy z jmeného prostoru System.DataAnnotations. Pomocí ViewModel.ModelMetadata se tedy můžeme dostat k dašlím zajímavým informacím o viewmodelu, což umožnilo vylepšení validací, a to jak server-side, tak client-side (v JavaScriptu). Např. není problém udělat ani remote client-side validace.

Templating

Asi nejzásadnější věc, které vznikla díky ModelMetadata, je templating. Templating je zjednodušeně řečeno mechanismus, který nám umožní pro každý datový typ specifikovat, jak se bude renderovat pro prohlížení (DisplayTemplate) a pro editaci (EditorTemplate). K tomu slouží především metody Html.DisplayFor a Html.EditorFor.
Pokud chceme např. vytvořit templates pro třídu Product, stačí vytvořit ascx soubory (de facto klasické partial views) v podadresářích DisplayTemplates a EditorTemplates.
Velice pěkný a podrobný seriál o templatingu v ASP.NET MVC 2 napsal Brad Wilson, zájemcům o hlubší poznání doporučuji.

Ostatní

V ASP.NET MVC 2 přišlo i několik drobných změn, které mohou zpříjemnit život, např. asynchronní controller, který může přispět k větší výkonnosti naší aplikace, explicitnější zápis volitelných routovacích parametrů pomocí UrlParameter.Optional (podrobnější popis od Phila Haacka), nebo explicitní zápis defaultních hodnot parametrů akčních metod pomocí standardního atributu DefaultValue.

Bonus: generování odkazů

Jak jistě víte, odkazy se ve view generují často pomocí Html.ActionLink. Defaulně se mu ale předávají stringy, což jak víme, je fůj. Takže v MvcFutures byly k dispozici metody, které umějí generovat odkazy silně typově, pomocí generik a lambda funkcí. Velmi pěkné! Ale strašlivě pomalé 😦
Právě proto vznikl projekt T4MVC (nyní součást projektu MvcContrib), který využívá T4 (generování kódu ještě před kompilací) a umožňuje bezpečné generování odkazů. Osobně ale doufám, že se podaří urychlit původní generování pomocí generik a budu jej moct v pohodě používat. Proč? Jednoduše proto, že se mi takový zápis líbí víc 🙂

6 thoughts on “ASP.NET MVC 2

  1. Jo, tohle vím, ReSharper používám, ale nechtěl jsem ho zmiňovat, protože není pro běžné nasazení ve firmě zadarmo. Ale díky za doplnění 😉

    To se mi líbí

  2. Ahoj, pěkné novinky. Mě by celkem zajímaly novinky okolo „Areas“. Konkrétně toto, mám web a chci doplnit správu uživatelů, která by mohla být samostatným projektem, protože to nejspíše využiji i jinde. Půjde to snadno nebo složitě a jak to vlastně udělat (možná tip na článek?).
    Díky
    — J.

    To se mi líbí

  3. Areas jsem úmyslně nezmiňoval, protože jsem jim moc nepřišel na chuť 😦
    Prapůvodně byly areas navrženy právě tak, že každá area byla jeden projekt, ale, skoro bych řekl „na nátlak komunity“, to je teď tak, že jsou všechny areas v jednom projektu.
    Ale chápu Tvůj požadavek. IMHO by to neměl být problém – teď jsem se díval, a při volání AreaRegistration.RegisterAllAreas() se prochází všechny referencované assemblies. Takže teoreticky by mělo stačit mít v projektu UserManagement třídu odvozenou od abstraktní třídy AreaRegistration, a tuto assembly pak nareferencovat.

    To se mi líbí

Napsat komentář

Tento web používá Akismet na redukci spamu. Zjistěte více o tom, jak jsou data z komentářů zpracovávána.