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));
}
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.
Jeden z nejlepších seriálů na dané téma.
OdpovědětVymazatDěkuji za všechny.