sobota 14. února 2015

Validace v ASP.NET - závěr

Tento příspěvek je ohledně validace a lokalizace v ASP.NET MVC poslední. Jak jsem avizoval v předchozích dílech, dávám k dispozici zdrojový kód k všemu, co jsem popsal.

Ke stažení i jen k podívání je na https://mvclocalization.codeplex.com/SourceControl/latest. K projektu se tedy můžete připojit jako k jinému TFS serveru a nebo si kód stáhnout na počítač v balíčku.


Ať tak či onak, po otevření ve Visual Studio se vám objeví struktura celého solution a projekt je rozdělen tak, jak byla jednotlivá řešení postupně popisována, tedy:



Validace v ASP.NET MVC poprvé a snadno - MvcSimplyCleverPart1
Validace v ASP.NET MVC podruhé - MvcSimplyCleverPart2

Projekt MvcSimplyCleverPart3 je pak popsán v tomto a těchto dílech:

Validace v ASP.NET potřetí a globálně - 1
Validace v ASP.NET potřetí a globálně - 2
Validace v ASP.NET potřetí a globálně - 3

Jak na validaci s pravidly v databázi

Veškeré kouzlo spočívá v napsání vlastního providera, který je následně používán MVC díky tomuto příkazu v global.asax:

ModelValidatorProviders.Providers.Add(new SimplyCleverModelValidatorProvider());

Ten pak žádné validátory ani sám nevyrábí - jak lze zjisitit pohledem do zdrojového kódu, tak používá již hotové a připravené DataAnnotationsModelValidationFactory objekty a vrací je podle dat, získaných z databáze - viz metoda  GetValidators a tento kód:

var rules = metadataCountry.AddressFormatInfo.FieldRules.FirstOrDefault(fr => fr.FieldKey.Equals(metadata.PropertyName)).Rules;

foreach (var rule in rules)
{
    DataAnnotationsModelValidationFactory factory;

    if (!AttributeFactories.TryGetValue(rule.Key, out factory))
    {
        factory = DefaultAttributeFactory;
    }
    var validatorType = TypeFactory[rule.Key];

    var validator =  (ValidationAttribute)Activator.CreateInstance(validatorType, GetValidationArgs(rule));

    validator.ErrorMessage = this.resourceManager.GetString("Error" + rule.MessageKey) ?? rule.MessageKey;
    results.Add(factory(metadata, context, validator));
}

A to je prakticky vše - v zdrojovém kódu je pak samozřejmě načítání dat z databáze a spousta dalších věci.

Upozornění  na závěr

Zde uvedený kód slouží jen jako demonstrace využití možností, které ASP:NET MVC nabízí. Určitě by šel zlepšit, určitě jsou tam nedokonalosti a zcela určitě ho nelze jen tak, bez prostudování,  pochopení principů a dotažení detailů použít pro "ostré" projekty - to ostatně nebylo ani cílem této série. Jak jsem již uvedl, soustředil jsem se především na popsání některých rozšiřovacích bodů MVC a spíše jsem se snažil o názornost. 

Nicméně se nejedná jen o teorii, do detailu dotažené a  hotové řešení je úspěšně, již několik let,  použito v několika větších  projektech. 

Pokud projekt spustíte, zejména tedy MvcSimplyCleverPart3 použít pro první stránku v případě českého nastavení adresu http://<host>/Kontakty/Výchozí, pro  anglickém nastavení pak http://<host>/Contact/List. Další jazyky nejsou podporovány, respektive je jen na vás, pokud si chcete jejich podporu dodat a nebo  si celé routování dále přizpůsobit.

Případné otázky, poznámky či upozornění na chyby můžete vkládat do diskuze.

1 komentář:

  1. Jeden z nejlepších seriálů na dané téma.
    Děkuji za všechny.

    OdpovědětVymazat