Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: liborsky
  • Nový dnes Dnes nových 1
  • Nový včera Včera nových: 0
  • Počet uživatelů: Celkem: 4708
Lidé online:
  • Návštěvníci: Návštěvníků: 19
  • Registrovaných Členů: 0
  • Celkem Celkem: 19
Mapa Stranek

ASP.NET MVC nám dospívá

Je tomu již nějaký ten pátek, co jsem naposledy věnoval článek ASP.NET MVC frameworku. Mezi tím ale jeho tvůrci nespali a bombardovali nás jedním releasem za druhým. ASP.NET MVC tak pomalu dostává finální podobu pro svojí verzi 1.0 a my si dnes shrneme všechny novinky tak jak přicházeli v jednotlivých releasech, spolu s krátkým popisem toho co nám přinášejí, postupně od nejstarších po nejnovější.

Článek je určen hlavně lidem, kteří již nějakou zkušenost s ASP.NET MVC mají a spíše nestíhají sledovat vývoj nových verzí, ale má také informativní hodnotu pro ty, kteří jsou v ASP.NET MVC nováčky. Ti si zde mohou udělat lepší představu o tom, jak framework funguje a jak jim může zjednodušit život, pokud ho použijí.

 

 

Preview 3

Ve verzi Preview 3 jsme se poprvé setkali se změnou návratových typů akcí. Nyní již akce nemají návratový typ void, ale vrací objekt odvozený od ActionResult. Tímto objektem může být View, RedirectToAction, JsonResult, ContentResult (pro předávání obsahu bez vlastního View), HttpRedirect a RedirectToAction/Route. Můžeme také například vytvořit vlastní odvozenou třídu, která bude vracet RSS feed atd. Další z výhod tohoto přístupu je zjednodušení Unit Testingu (není potřeba mocking…).

 

Příklad:

public ActionResult Delete(string id)

        {

            //logika…

            return RedirectToAction("Index");
       
}

 

Tato verze také přináší automatické plnění hodnot z ViewData do html formulářů, textových polí aj. Shoduje-li se tedy položka ve ViewData s názvem html prvku, bude hodnota automaticky vyplněna.

 

Příklad:

            Controller:

            ViewData["Date"] = DateTime.Today;

 

            View:

            <%= Html.TextBox("Date") %>

 

 

V Preview 3 se nově vyskytují třídy SelectList and MultiSelectList, které slouží ke snadnému vytváření html seznamů.

 

Příklad:

            ViewData["seznam"]

= new SelectList(items, "DataValue", "DataText", selectedValue);

 

 

Byla také vylepšena práce s URL cestami a to jednak díky bohatší podpoře znaků, které se můžou v definici cesty vyskytnout (čárka, tečka, středník…) a druhak díky pomocným funkcím MapRoute() a IgnoreRoute(), které usnadňují registraci pravidel pro URL cesty.

 

Příklad:

routes.MapRoute(

     "Default",                    // unikatni nazev pravidla

"{lang}-{locale}/{controller}/{action}/{id}.{id2}",  // URL               

new { controller = "Home", action = "Index“}  // defaultní hodnoty

      );

 

 

 

Preview 4

Preview 4 bylo zaměřeno hlavně na zlepšení práce s filtry, které byly v základní podobě představeny v předchozí verzi (Preview 2). Filtry slouží k registraci kódu, který se má vykonat před a po spouštění nějaké Akce.

V této verzi byly rozděleny do 4 typů:

1. IAuthorizationFilter – běží dříve než jakýkoliv jiný filtr, dovoluje zrušení běhu Akce

            2. IActionFilter – dovoluje spouštět kód před a po zavolání akce, ale dříve než je Akce vykonána

            3.  IResultFilter – dovoluje spouštět kód před a po zpracování výsledku akce

            4. IExceptionFilter – běží vždy a je zaručeno, že bude spuštěn jako poslední, umožnuje reagovat na výjimky vyvolané při zpracování akce

 

Přesto, že tyto rozhraní jsou určitě užitečná a dovolují velkou flexibilitu při práci s akcemi, při běžné praxi se setkáte spíše se 3 implementacemi daných filtrů.

A ty jsou následující:

1. OutputCache – umožňuje ukládat výsledky do vyrovnávací paměti. Výsledek může být platný buďto po určitou dobu, nebo pro určité parametry http požadavku (více viz. caching v klasickém ASP.NET)

2. HandleError – odchytává všechny výjimky a přesměrovává uživatele na stránku s chybovým hlášením. Pro každou výjimku může být nadefinována vlastní chybová stránka.

3.  Authorize – umožňuje omezit přístup k daným akcím jenom přihlášeným uživatelům, popřípadě některým konkrétním uživatelům nebo uživatelům v nějaké roli.

 

Aby byl vývoj nové MVC aplikace co nejsnadnější, objevil se v šabloně projektu v této verzi také Controller, který se stará o přihlašování a registraci uživatelů (využívá standardního ASP.NET Forms autentifikačního mechanizmu, ale je velmi snadné ho upravit dle vlastních potřeb).

 

 

 

Preview 5

Zatím změnami snad nejnabitější release přinesl jako první novinku tzv. „částečné pohledy“. Koncept velmi podobný User Controllům z klasického ASP.NET, umožňuje vložení a znovupoužití View kódu v rámci jiného View. Nejenom, že ASP.NET MVC nyní umožňuje skládání pohledů tímto způsobem, ale každý pohled může také být zpracován a vykreslen jiným enginem. Záhlaví stránky tak může například vykreslit defaultní ASP.NET view engine, a menu engine, který rozumí skriptovacímu jazyku HAML… Tato funkcionalita může přijít obzvláště vhod například pro vykreslování AJAX odpovědí skrze PartialViewResult návratový objekt Akce.

Příklad:

      <% Html.RenderPartial("jmenoPohledu"); %>  

 

Před touto verzí ASP.NET MVC, pokud jsme si vyžádali URL „/blog/post/clanek-o-necem“, musela v Controlleru s názvem Blog existovat akce s názvem Post, jinak došlo k chybě. Od této verze dále je však možné přidat metodě definující Akci atribut ActionName, který umožnuje mít odlišné jméno metody od jména akce, která tuto metodu vyvolá.

 

Příklad:

 [ActionName("JinyNazev")]

        public ActionResult NejakyNazev(string id)

        {

//...

        }

Stejně tak je možné nadefinovat atribut vycházející z ActionSelectionAttribute, což nám umožní implementovat libovolnou logiku, která rozhodne o tom, zda je metoda ověnčená tímto atributem vhodným kandidátem pro zpracování daného požadavku. Opět je nutno podotknout, že při běžném vývoji této funkcionality pravděpodobně nevyužijete a mnohem spíše se setkáte s jedním atributem AcceptVerbs odvozeným z výše popsaného. Tento atribut umožňuje rozlišit akce vyvolané při http požadavku GET a POST.

 

Příklad:

            [AcceptVerbs(HttpVerbs.Post)]

        public ActionResult Index(Task task)

{

//...

}

(Poznámka: Tato syntaxe pro AcceptVerbs atribut je platná až od verze Beta)

 

Dalším novým konceptem jsou „Model Binders“, které umožňují mapovat hodnoty z html formuláře na komplexní objekty Vaší domény a hrají klíčovou roli při validaci formulářů, ke které se dostaneme níže. Není tedy již potřeba manuálně přiřazovat jednotlivé položky formuláře na properties objektu v rámci Akce, ale je možné tento proces automatizovat.  

S tím spojené jsou také 2 nové pomocné funkce UpdateModel and TryUpdateModel, jež se snaží aktualizovat existující objekt novými daty z formuláře. Obě funkce se pokusí namapovat všechny hodnoty a liší se v tom, že pokud mapování některé z hodnot selhalo, první funkce skončí výjimkou, kdežto druhá false návratovou hodnotou.

Ve verzi Beta ještě přibyl defaultní ModelBinder, který zvládá validovat a přiřadit hodnoty komplexnímu typu, pokud jsou properties základními .NET typy (string, int atd.).  Chceme-li však přiřadit typy komplexnější, jako například DateTime, což bude myslím velmi častý případ, musíme se uchýlit k vytvoření vlastního ModelBinderu pro danou komplexní třídu.

Ve verzi Beta se však vyskytuje v defaultním model binderu chyba, a sice pokud v html formuláři nevyplníte standardní textové políčko, model binder přiřadí jako hodnotu prázdný řetězec namísto NULL. To zabraňuje správné validaci při ukládání do databáze, pokud řetězec nesmí být prázdný. Napravit to lze buďto vytvořením vlastního Model Binderu, nebo přidáním kontroly na prázdný řetězec přímo do Akce a eventuální přidání chyby do ModelState/nastavení řetězce na NULL.

 

Příklad:

            Controller:

[AcceptVerbs(HttpVerbs.Post)]

        public ActionResult Index(Task task) //Task je nas komplexni typ

        {

            if(ModelState.IsValid)

                TaskRepository.PutTask(task);

 

            //atd...

  }

 

            TaskBinder:

      public ModelBinderResult BindModel(ModelBindingContext bindingContext)

        {

            Task task = new Task();

 

            ValueProviderResult id = bindingContext.ValueProvider.GetValue("Id");

 

            if(id != null && id.AttemptedValue != "")

                task.Id = new Guid(id.AttemptedValue);

            else

                task.Id = Guid.NewGuid();

 

 

 

            ValueProviderResult dueDate = bindingContext.ValueProvider.GetValue("DueDate");

            task.DueDate = DateTime.Today;

 

            if (dueDate == null || dueDate.AttemptedValue == "")

            {

                bindingContext.ModelState.AddModelError("DueDate", "Due date not specified.");         

            }

            else

            {

                try

                {

                    task.DueDate = DateTime.Parse(dueDate.AttemptedValue);

                }

                catch (FormatException)

                {

                    bindingContext.ModelState.AddModelError("DueDate", "Due date is not in correct format.");

                }

            }

 

            //atd...

 

            return new ModelBinderResult(task);

        }

Poznámka: Tato infrastuktura Model Binderu je platná až ve verzi Beta.

 

 

Velmi atraktivní novinkou ASP.NET MVC frameworku je validace formulářů, která jde ruku v ruce s výše popisovanou funkcionalitou Model Binderů a také s novou vlastností Controlleru ModelState. ModelState umožnuje vylistovat či přidat pro vyvolanou akci nové validační chyby, které jsou pak automaticky zobrazeny ve View. A jak je toho dosaženo? Když nyní použijete pro vykreslení nějakého html prvku pomocnou funkci (<%= Html.TextBox(…) %>), je css styl daného prvku upraven v závislosti na tom, zda je hodnota validní, či nikoliv. Css styly pro validační chyby lze samozřejmě nadefinovat vlastní a tak Vám nic nebrání tomu, přizpůsobit si vzhled Vaší stránky vašim nejtajnějším přáním a potřebám.

 

Příklad:

            Viz. Předchozí příklad na použití Model Binderů.

 

 

Beta

 

Zatím poslední verze Beta přináší většinou jen kosmetické úpravy, drobné změny v infrastruktuře a celkově zlepšuje finální pocit z práce s frameworkem. Snad jedinou výjimku, co se týče významnosti změny, tvoří podpora JavaScriptové knihovny jQuery. Ta slouží k usnadnění procházení html dokumentů, pro snadnější obsluhu událostí, animace a jednodušší klientskou část AJAX transakcí. K základní jQuery knihovně lze ještě přidat jQueryUI, která přidává spoustu interaktivních prvků do stránky, ať už jsou to různé panely, šoupátka, kalendáře či drag&drop podpora (více na http://ui.jquery.com/).

 

Rychlý výčet drobných změn, které jsme zatím nezmínili, tvoří:

1.      Add View“ položka menu ve Visual Studiu pro rychlejší vytváření nových pohledů

2.       nový \Script adresář doporučený pro skladování všech JS skriptů v projektu

3.      Podpora pro integraci Silverlight aplikací do ASP.NET MVC

4.      Podpora pro nasazení aplikace jak skze GAC, tak \bin adresář na serveru

 

… a další

 

 

Závěr

Dnes jsem se Vám pokusil představit všechny novinky, které se za poslední půl rok v ASP.NET MVC objevili a myslím, že tento článek může posloužit jako dobrá reference při hledání postupů pro řešení nějakého problému v ASP.NET MVC.

Dále bych Vás chtěl ještě odkázat na http://yatl.ondrejstastny.cz, kde si můžete prohlídnou webový úkolníček, který jsem vytvořil v ASP.NET MVC Beta během velmi krátké chvíle a bez větší námahy a demonstruje použití různých efektů jQuery, Model Bindery aj.

 

Ondřej Šťastný
MSP, Project Manager, Developer
www.ondrejstastny.cz

Ondřej Šťastný :: 12. listopadu 2008 :: 431 shlédnutí :: 0 komentářů
kategorie: Vývoj webových aplikací

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. ASP.NET programátor zlín [12.16.2008 10:17 odp.]
    Dobrý den,v současné době hledáme programátora na pozici: ASP.NET / C# programátor - Zlín Požadavky: schopnost sam...
  2. RE: MS Fest video [12.08.2008 6:20 odp.]
    AhojVideo záznam bude, po večerech pilně pracujeme na jeho stříhání. Po dokončení se zde určitě vyskytne link na stažení...
  3. MS Fest video [12.04.2008 4:18 odp.]
    Existuje videozáznam z MS Festu konaneho (koncem listopadu 2008) o vikendu na Male Strane na fakulty MFF? Je nekde mozne...
  4. Práce pro programátora [11.25.2008 10:12 dop.]
    Hledám nadšeného programátora na vytvoření webstránek online tv/stream video. V případě zájmu pište na email: projekt@tr...
Novinky z klubů

Novinky z klubů

  1. Programátorské večery: F# 15. prosince 2008
    Ve čtvrtek 18.12.2008 se v rámci programátorských večerů uskuteční přednáška n...
  2. Programátorské večery: VSTO 10. prosince 2008
    Nad kancelářským balíkem MS Office se dají tvořit rozsáhlé aplikace. Od jednod...
  3. Programátorské večery: .NET 4.0 3. prosince 2008
    Zajímá Vás, na co se můžete těšit v nové verzi .NETu? Pak se přijďte podívat n...
  4. Záznamy z programátorských večerů 3. prosince 2008
    Záznamy z prog. večerů (prezentace+dema, občas i nějaké to video) můžete dočasně najít na http://ci...
Co se píše jinde

Co se píše jinde

Windows 7 Beta k dispozici pro MSDN předplatitele

Windows 7 Beta k dispozici pro MSDN předplatitele

Silverlight 2 úvod

Zajímá vás psaní webových aplikací na straně klienta ve vašem oblíbeném nástroji v .NETu? Slyšeli jste o Silverlightu...

PF 2009

Co tak popřát čtenářům programátorského blogu do nového roku? Snad abyste dostávali rozumná zadání a nemuseli tenkou ...

TypeConvertery

V tomto díle si vysvětlíme, co jsou TypeConvertery a k čemu se používají. To si také ukážeme na příkladu.

Atributy jmenného prostoru System.ComponentModel

V tomto článku si ukážeme jak efektivně využívat atributy z jmenného prostoru System.ComponentModel při vytváření vla...