Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Validace v ASP.NET MVC

13.56 - 2. května 2009 | ASP.NET 2.0

Bezpodmínečnou nutností každé aplikace, která zpracovává data z neznámých zdrojů, je validace vstupních dat. V ASP.NET je poměrně sofistikovaná sada komponent, které přidají k vašim vstupním polím validační podmínky a v případě jejich nesplnění je uživatel informován. Validace probíhá jak na straně klienta (pomocí JavaScriptu), tak i na straně serveru. Jenže tyto komponenty jsou plně závislé na serverovém formuláři a v ASP.NET MVC je tedy nelze použít.

Nyní mírně odbočím. Z předchozího odstavce jste si mohli odnést jednu myšlenku. A to, že validace je součástí UI vrstvy aplikace. Pokud však píšete aplikaci, která obsahu spoustu business pravidel, není to úplně nejšťastnější, když máte validační pravidla v UI a pak ještě někde ve vašem modelu. Jedno ze základních pravidel dobrého návrhu říká DRY (don’t repeat yourself – neopakuj se).

ModelState

ASP.NET MVC tedy nepřináší validátory, ale infrastrukturu, která umožňuje v případě chyby uživatele upozornit. Tato infrastruktura je postavená na stavu modelu (ModelState). Stav modelu má vlastnost IsValid a metodu AddModelError. V HtmlHelperu pak najdete dvě extenze ValidationMessage a ValidationSummary, které vypisují chybové hlášky pro konkrétní pole nebo sumář pro všechny. A to je vše, co nám MVC poskytuje. Další práce už je jen na nás.

Jak pracovat se stavem modelu na nejnižší úrovni ukazuje jeden z tutoriálů: Performing Simple Validation. Možná vám to bude stačit, ale pro mne je to příliš práce navíc a ani trochu mi to nepřijde sexy. :) Jaké máme další možnosti?

Můžeme využít vlastní validační vrstvu naší business logiky a napojit jí na stav modelu, tak, jak to ukazuje následující tutoriál: Validating with a Service Layer. Nebo vyžijeme existujících validačních frameworků. Dnes se podíváme na System.Componen­tModel.DataAn­notations a příště na Caste.Componen­ts.Validators.

DataAnnotations

Anotace dat je novinka z ASP.NET Dynamic Data, která usnadňuje automatické generování ASP.NET validátorů na základě modelu. Tyto anotace se dále rozšiřují a v .net 4.0 by to měla být hodně použitelná věcička, která bude v ASP.NET DD, ASP.NET MVC a dokonce i v .net RIA Services. Každopádně nemusíme čekat na velký release platformy a využít anotací již dnes. Jak to tedy funguje?

Jediné, co musíte udělat, je označit vlastnosti vašeho modelu atributy:

[Required]
public string Name { get; set; }

[RegularExpression("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$ ")]
public string Email { get; set; }

Dalším krokem je zaregistrovat nový model binder ` DataAnnotation­sModelBinder`, který na základě anotací provede validaci modelu a nastaví případně jeho stav na nevalidní. O víc už se starat nemusíme. Kde tento model binder získat a další potřebné informace najdete v článku Brada Wilsona DataAnnotations and ASP.NET MVC.

Protože jsem DataAnnotations použil v jedné aplikaci, tak mám několik zkušeností, o které se můžu podělit. DataAnnotation­sModelBinder má problém s komplexními typy, které mají vlastnosti taktéž komplexních typů. Jedním z možných řešení, je hacknout tento model binder a přidat podmínku na ověření komplexní vlastnosti, nebo používat DTO pouze pro účely formulářů ve view (ano, opět návrat k validaci pouze ve view vrstvě). Anotace podporují vracení chybových hlášek z resource souborů, tak nezapomeňte raději všechny hlášky přepsat, protože ty výchozí nevypadají zrovna nejlépe.

Tak, to bychom měli jeden model binder, který už je hotový. Ale jak si napsat vlastní? To si ukážeme někdy příště na Caste.Componen­ts.Validators­. :)

Autor: Aleš Roubíček | Přidej komentář | Delicious | Digg | FriendFeed | Facebook | Linkuj! | Jagg

Komentáře RSS

  1.  

    Petr

    16.12 - 11. května 2009 | #

    Co xVal? http://www.co­deplex.com/xval

  2.  

    Aleš Roubíček

    08.07 - 12. května 2009 | #

    [1] Petr: xVal je dobrý ke generování vlidačních pravidel ve view. Jistě se u něj v dalším díle zastavím.

  3.  

    Steve

    23.56 - 28. května 2009 | #

    Mně se víc líbí, když se o validaci stará samostatná třída. Řekněme třeba obecně interface IValidator<T>, který by měl metodu IsValid, co by brala jako parametr instanci validovaného objektu. Potom by se a) dalo udělat více validačních scénářů pro jeden model (víc implementací IValidator<Muj­Model>) a b) by se pak takový validátor dal třeba controlleru předat v konstruktoru a byla by injektovaná i validace. Něčeho podobného se dá dosáhnout s MS Entlib Validation Block a možná i s Castle.Validation s tím zatím nemám zkušenosti. U Entlib mi vadí, že se všechny takové validátory dají nakonfigurovat jenom v xml, víc by se mi líbil nějaký fluent interface.

Místo pro tvůj názor

Povinné je jméno a komentář, z e-mailu se rozpoznají Gravatary.
Komentář je formátován pomocí Texy! syntaxu.
Například: **tučný text**, *kurzíva*, "text odkazu":adresa.
Internetové adresy jsou převáděny na odkazy.
Na komentáře se můžete odkazovat pomocí [číslo komentáře].

Nový komentář