čtvrtek 29. ledna 2015

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

V předchozích dílech jsem popsal jednoduchou i trochu složitější validaci adres a dotkl se i lokalizace.  Jak je vidět, validace i lokalizace  je jednoduchá, pokud máme jen malé rozmanitosti v datech  - například chceme pracovat jen s adresami v USA nebo v ČR. Ale validace zadávaných adres i celková lokalizace se může stát noční můrou v případě, že chceme podporovat adresy z více zemí. Každá z nich používá trochu jiný formát adresy a odlišná pravidla hlavně pro obdobu poštovního směrovacího čísla.



Mezinárodní rozdíly

Při zadávání adresy jsou i jednotlivá pole označována různě dle zvyklostí dané země, jen v anglofonní zemích se  lze setkat s těmito názvy pro jednotlivé položky adres:

  • City i Postal town
  • Zip i Post code
  • State i Province

Mnoho aplikací jako vstup

Co dále nelze při tvorbě podobných aplikací pominout je fakt, že webová aplikace pro zadávání adres je často jen jedním z několika způsobů, jak se nám do systému mohou adresy dostat a uživatelé tedy mají na výběr více aplikací a adresy jsou tak zadávány několika kanály. A tedy pravidla, která si nastavíme pro webovou aplikaci by se měla dodržovat i v ostatních vstupních kanálech. Situace může vypadat takto:

Sjednocení pravidel

Jak ale na to? Jedním řešením může být použití nějakého jednotného způsobu popisu těchto pravidel. Takto vyjádřená pravidla pak můžeme uložit do sdílené aplikace a každá z aplikací tak může tato pravidla získat, interpretovat dle svých možností a použít. Představu o koncepci takového řešení lze získat z tohoto obrázku:




A jak by takový jednotný způsob popisu pravidel měl vypadat? Já si údaje uložil do databáze s velmi jednoduchou strukturou - je v ní uložen seznam zemí,  seznam států či provincií, informaci o formátu adresy, tedy jaké rozložení formuláře se má použít, jaké  jsou názvy jednotlivých polí, pravidla apod. 

Schéma databáze vypadá takto - předem upozorňuji, že to není žádné normalizované schéma, snažil jsem se jen co nejjednodušeji zachytit princip uložení dat:


V tabulce Countries jsou uloženy jednotlivé země a  v CountryStates pak jednotlivé státy, provincie či teritoria, pokud je tedy země má.

V tabulce ValueRules jsou soustředěna jednotlivá pravidla, respektive názvy pravidel - víceméně kopírují názvy atributů, které se používají v MVC pro validaci - není to ale nutné, lze si je pojmenovat jakkoliv.

V tabulce ValueRuleParameters jsou pak názvy atributů pro jednotlivé ValueRules.

V tabulce AddressFields jsou pak názvy polí odpovídajíc vlastnostem třídy Address - všimněte si, že zde chybí  Line2 a to proto, že tohle pole není ani vyžadováno, ani validováno a nemá ani vlastní název - pokud by tomu tak mělo být, muselo by zde být.

public class AddressViewModel
{
    public string Line1 { get; set; }

    public string Line2 { get; set; }

    public string City { get; set; }

    public string County { get; set; }

    public string StateCode { get; set; }

    public string ZipCode { get; set; }

    [Display(Name = "Country", ResourceType = typeof(SimplyCleverResources))]
    public string CountryCode { get; set; }
}

Protože se počítá s lokalizací, existuje tabulka AddressLabels, která obsahuje názvy jednotlivých klíčů, podle kterých by lokalizovaná hodnota měla být získána z resource souborů. Pokud by toto nebylo vyžadováno, šlo by zde rovnou zadat názvy prvků.
Dohromady to pak vše propojují zbývající tabulky:
  • CountryAddressFieldLabels určuje, jak se které políčko adresy má pro danou zemi jmenovat.
  • CountryAddressFieldValueRules pak udává, jaké pravidlo se má pro to které políčko adresy a tu kterou zemi použít. A nakonec 
  • CountryAddressFieldValueRuleParameters  obsahuje parametry pro toto pravidlo, tedy například konkrétní dovolenou délku, regulární výraz pro validaci PSČ apod.
Skript pro naplnění databáze vypadá takto:

DELETE FROM AddressBrokenValueRuleMessages
DELETE FROM AddressFields
DELETE FROM AddressLabels
DELETE FROM Countries
DELETE FROM CountryAddressFieldLabels
DELETE FROM CountryAddressFieldValueRuleParameters
DELETE FROM CountryAddressFieldValueRules
DELETE FROM CountryStates
DELETE FROM ValueRuleParameters
DELETE FROM ValueRules


EXECUTE InsertOrUpdateCountry 'AU', 'Australia', 'Layout2'
EXECUTE InsertOrUpdateCountry 'BE', 'Belgium', 'Layout3'
EXECUTE InsertOrUpdateCountry 'BR', 'Brazil', 'Layout2'
EXECUTE InsertOrUpdateCountry 'CA', 'Canada', 'Layout2'
EXECUTE InsertOrUpdateCountry 'CZ', 'Czech Republic', 'Layout3'
EXECUTE InsertOrUpdateCountry 'IN', 'India', 'Layout3'
EXECUTE InsertOrUpdateCountry 'MX', 'Mexico', 'Layout2'
EXECUTE InsertOrUpdateCountry 'SG', 'Singapore', 'Layout3'
EXECUTE InsertOrUpdateCountry 'GB', 'United Kingdom', 'Layout3'
EXECUTE InsertOrUpdateCountry 'US', 'United States', 'Layout1'

EXECUTE InsertOrUpdateCountryState 'AU', 'ACT', 'Australian Capital Territory'
EXECUTE InsertOrUpdateCountryState 'AU', 'NSW', 'New South Wales'
EXECUTE InsertOrUpdateCountryState 'AU', 'NT', 'Northern Territory'
EXECUTE InsertOrUpdateCountryState 'AU', 'QLD', 'Queensland'
EXECUTE InsertOrUpdateCountryState 'AU', 'SA', 'South Australia'
EXECUTE InsertOrUpdateCountryState 'AU', 'TAS', 'Tasmania'
EXECUTE InsertOrUpdateCountryState 'AU', 'VIC', 'Victoria'
EXECUTE InsertOrUpdateCountryState 'AU', 'WA', 'Western Australia'
EXECUTE InsertOrUpdateCountryState 'AU', 'CCK', 'Cocos  Keeling Islands'
EXECUTE InsertOrUpdateCountryState 'AU', 'CXR', 'Christmas Island'
EXECUTE InsertOrUpdateCountryState 'AU', 'HMD', 'Heard Island and McDonald Islands'
EXECUTE InsertOrUpdateCountryState 'AU', 'NFK', 'Norfolk Islands'
EXECUTE InsertOrUpdateCountryState 'AU', 'XAA', 'Australian Antarctic Territory'
EXECUTE InsertOrUpdateCountryState 'BR', 'AC', 'Acre'
EXECUTE InsertOrUpdateCountryState 'BR', 'AL', 'Alagoas'
EXECUTE InsertOrUpdateCountryState 'BR', 'AM', 'Amazonas'
EXECUTE InsertOrUpdateCountryState 'BR', 'AP', 'Amapá'
EXECUTE InsertOrUpdateCountryState 'BR', 'BA', 'Bahia'
EXECUTE InsertOrUpdateCountryState 'BR', 'CE', 'Ceará'
EXECUTE InsertOrUpdateCountryState 'BR', 'DF', 'Distrito Federal'
EXECUTE InsertOrUpdateCountryState 'BR', 'ES', 'Espírito Santo'
EXECUTE InsertOrUpdateCountryState 'BR', 'GO', 'Goiás'
EXECUTE InsertOrUpdateCountryState 'BR', 'MA', 'Maranhão'
EXECUTE InsertOrUpdateCountryState 'BR', 'MG', 'Minas Gerais'
EXECUTE InsertOrUpdateCountryState 'BR', 'MS', 'Mato Grosso do Sul'
EXECUTE InsertOrUpdateCountryState 'BR', 'MT', 'Mato Grosso'
EXECUTE InsertOrUpdateCountryState 'BR', 'PA', 'Pará'
EXECUTE InsertOrUpdateCountryState 'BR', 'PB', 'Paraíba'
EXECUTE InsertOrUpdateCountryState 'BR', 'PE', 'Pernambuco'
EXECUTE InsertOrUpdateCountryState 'BR', 'PI', 'Piauí'
EXECUTE InsertOrUpdateCountryState 'BR', 'PR', 'Paraná'
EXECUTE InsertOrUpdateCountryState 'BR', 'RJ', 'Rio de Janeiro'
EXECUTE InsertOrUpdateCountryState 'BR', 'RN', 'Rio Grande do Norte'
EXECUTE InsertOrUpdateCountryState 'BR', 'RO', 'Rondônia'
EXECUTE InsertOrUpdateCountryState 'BR', 'RR', 'Roraima'
EXECUTE InsertOrUpdateCountryState 'BR', 'RS', 'Rio Grande do Sul'
EXECUTE InsertOrUpdateCountryState 'BR', 'SC', 'Santa Catarina'
EXECUTE InsertOrUpdateCountryState 'BR', 'SE', 'Sergipe'
EXECUTE InsertOrUpdateCountryState 'BR', 'SP', 'São Paulo'
EXECUTE InsertOrUpdateCountryState 'BR', 'TO', 'Tocantins'
EXECUTE InsertOrUpdateCountryState 'CA', 'AB', 'Alberta'
EXECUTE InsertOrUpdateCountryState 'CA', 'BC', 'British Columbia'
EXECUTE InsertOrUpdateCountryState 'CA', 'MB', 'Manitoba'
EXECUTE InsertOrUpdateCountryState 'CA', 'NB', 'New Brunswick'
EXECUTE InsertOrUpdateCountryState 'CA', 'NL', 'Newfoundland'
EXECUTE InsertOrUpdateCountryState 'CA', 'NT', 'Northwest Territory'
EXECUTE InsertOrUpdateCountryState 'CA', 'NS', 'Nova Scotia'
EXECUTE InsertOrUpdateCountryState 'CA', 'NU', 'Nunavut'
EXECUTE InsertOrUpdateCountryState 'CA', 'ON', 'Ontario'
EXECUTE InsertOrUpdateCountryState 'CA', 'PE', 'Prince Edward Island'
EXECUTE InsertOrUpdateCountryState 'CA', 'QC', 'Quebec'
EXECUTE InsertOrUpdateCountryState 'CA', 'SK', 'Saskatchewan'
EXECUTE InsertOrUpdateCountryState 'CA', 'YT', 'Yukon Territory'
EXECUTE InsertOrUpdateCountryState 'MX', 'AGS', 'Aguascalientes'
EXECUTE InsertOrUpdateCountryState 'MX', 'MOR', 'Morelos'
EXECUTE InsertOrUpdateCountryState 'MX', 'BC', 'Baja California'
EXECUTE InsertOrUpdateCountryState 'MX', 'NAY', 'Nayarit'
EXECUTE InsertOrUpdateCountryState 'MX', 'BCS', 'Baja California Sur'
EXECUTE InsertOrUpdateCountryState 'MX', 'NL', 'Nuevo Leon'
EXECUTE InsertOrUpdateCountryState 'MX', 'CAM', 'Campeche'
EXECUTE InsertOrUpdateCountryState 'MX', 'OAX', 'Oaxaca'
EXECUTE InsertOrUpdateCountryState 'MX', 'COAH', 'Coahuila'
EXECUTE InsertOrUpdateCountryState 'MX', 'PUE', 'Puebla'
EXECUTE InsertOrUpdateCountryState 'MX', 'COL', 'Colima'
EXECUTE InsertOrUpdateCountryState 'MX', 'QRO', 'Queretaro'
EXECUTE InsertOrUpdateCountryState 'MX', 'CHIS', 'Chiapas'
EXECUTE InsertOrUpdateCountryState 'MX', 'Q ROO    ', 'Quintana Roo'
EXECUTE InsertOrUpdateCountryState 'MX', 'CHIH', 'Chihuahua'
EXECUTE InsertOrUpdateCountryState 'MX', 'SLP', 'San Luis Potosi'
EXECUTE InsertOrUpdateCountryState 'MX', 'DF', 'Distrito Federal'
EXECUTE InsertOrUpdateCountryState 'MX', 'SIN', 'Sinaloa'
EXECUTE InsertOrUpdateCountryState 'MX', 'DGO', 'Durango'
EXECUTE InsertOrUpdateCountryState 'MX', 'SON', 'Sonora'
EXECUTE InsertOrUpdateCountryState 'MX', 'GTO', 'Guanajuato'
EXECUTE InsertOrUpdateCountryState 'MX', 'TAB', 'Tabasco'
EXECUTE InsertOrUpdateCountryState 'MX', 'GRO', 'Guerrero'
EXECUTE InsertOrUpdateCountryState 'MX', 'TAMPS', 'Tamaulipas'
EXECUTE InsertOrUpdateCountryState 'MX', 'HGO', 'Hidalgo'
EXECUTE InsertOrUpdateCountryState 'MX', 'TLAX', 'Tlaxcala'
EXECUTE InsertOrUpdateCountryState 'MX', 'JAL', 'Jalisco'
EXECUTE InsertOrUpdateCountryState 'MX', 'VER', 'Veracruz'
EXECUTE InsertOrUpdateCountryState 'MX', 'MEX', 'Mexico'
EXECUTE InsertOrUpdateCountryState 'MX', 'YUC', 'Yucatan'
EXECUTE InsertOrUpdateCountryState 'MX', 'MICH', 'Michoacan'
EXECUTE InsertOrUpdateCountryState 'MX', 'ZAC ', 'Zacatecas'

EXECUTE InsertOrUpdateCountryState 'US', 'AK', 'ALASKA'
EXECUTE InsertOrUpdateCountryState 'US', 'AL', 'ALABAMA'
EXECUTE InsertOrUpdateCountryState 'US', 'AR', 'ARKANSAS'
EXECUTE InsertOrUpdateCountryState 'US', 'AS', 'AMERICA SAMOA'
EXECUTE InsertOrUpdateCountryState 'US', 'AZ', 'ARIZONA'
EXECUTE InsertOrUpdateCountryState 'US', 'CA', 'CALIFORNIA'
EXECUTE InsertOrUpdateCountryState 'US', 'CO', 'COLORADO'
EXECUTE InsertOrUpdateCountryState 'US', 'CT', 'CONNECTICUT'
EXECUTE InsertOrUpdateCountryState 'US', 'DC', 'DISTRICT OF COLUMBIA'
EXECUTE InsertOrUpdateCountryState 'US', 'DE', 'DELAWARE'
EXECUTE InsertOrUpdateCountryState 'US', 'FL', 'FLORIDA'
EXECUTE InsertOrUpdateCountryState 'US', 'FM', 'FEDERATED STATES OF MICRONESIA'
EXECUTE InsertOrUpdateCountryState 'US', 'GA', 'GEORGIA'
EXECUTE InsertOrUpdateCountryState 'US', 'GU', 'GUAM'
EXECUTE InsertOrUpdateCountryState 'US', 'HI', 'HAWAII'
EXECUTE InsertOrUpdateCountryState 'US', 'IA', 'IOWA'
EXECUTE InsertOrUpdateCountryState 'US', 'ID', 'IDAHO'
EXECUTE InsertOrUpdateCountryState 'US', 'IL', 'ILLINOIS'
EXECUTE InsertOrUpdateCountryState 'US', 'IN', 'INDIANA'
EXECUTE InsertOrUpdateCountryState 'US', 'KS', 'KANSAS'
EXECUTE InsertOrUpdateCountryState 'US', 'KY', 'KENTUCKY'
EXECUTE InsertOrUpdateCountryState 'US', 'LA', 'LOUISIANA'
EXECUTE InsertOrUpdateCountryState 'US', 'MA', 'MASSACHUSETTS'
EXECUTE InsertOrUpdateCountryState 'US', 'MD', 'MARYLAND'
EXECUTE InsertOrUpdateCountryState 'US', 'ME', 'MAINE'
EXECUTE InsertOrUpdateCountryState 'US', 'MH', 'MARSHALL ISLANDS'
EXECUTE InsertOrUpdateCountryState 'US', 'MI', 'MICHIGAN'
EXECUTE InsertOrUpdateCountryState 'US', 'MN', 'MINNESOTA'
EXECUTE InsertOrUpdateCountryState 'US', 'MO', 'MISSOURI'
EXECUTE InsertOrUpdateCountryState 'US', 'MP', 'NORTHERN MARIANA ISLANDS'
EXECUTE InsertOrUpdateCountryState 'US', 'MS', 'MISSISSIPPI'
EXECUTE InsertOrUpdateCountryState 'US', 'MT', 'MONTANA'
EXECUTE InsertOrUpdateCountryState 'US', 'NC', 'NORTH CAROLINA'
EXECUTE InsertOrUpdateCountryState 'US', 'ND', 'NORTH DAKOTA'
EXECUTE InsertOrUpdateCountryState 'US', 'NE', 'NEBRASKA'
EXECUTE InsertOrUpdateCountryState 'US', 'NH', 'NEW HAMPSHIRE'
EXECUTE InsertOrUpdateCountryState 'US', 'NJ', 'NEW JERSEY'
EXECUTE InsertOrUpdateCountryState 'US', 'NM', 'NEW MEXICO'
EXECUTE InsertOrUpdateCountryState 'US', 'NV', 'NEVADA'
EXECUTE InsertOrUpdateCountryState 'US', 'NY', 'NEW YORK'
EXECUTE InsertOrUpdateCountryState 'US', 'OH', 'OHIO'
EXECUTE InsertOrUpdateCountryState 'US', 'OK', 'OKLAHOMA'
EXECUTE InsertOrUpdateCountryState 'US', 'OR', 'OREGON'
EXECUTE InsertOrUpdateCountryState 'US', 'PA', 'PENNSYLVANIA'
EXECUTE InsertOrUpdateCountryState 'US', 'PR', 'PUERTO RICO'
EXECUTE InsertOrUpdateCountryState 'US', 'PW', 'PALAU'
EXECUTE InsertOrUpdateCountryState 'US', 'RI', 'RHODE ISLAND'
EXECUTE InsertOrUpdateCountryState 'US', 'SC', 'SOUTH CAROLINA'
EXECUTE InsertOrUpdateCountryState 'US', 'SD', 'SOUTH DAKOTA'
EXECUTE InsertOrUpdateCountryState 'US', 'TN', 'TENNESSEE'
EXECUTE InsertOrUpdateCountryState 'US', 'TX', 'TEXAS'
EXECUTE InsertOrUpdateCountryState 'US', 'UT', 'UTAH'
EXECUTE InsertOrUpdateCountryState 'US', 'VA', 'VIRGINIA'
EXECUTE InsertOrUpdateCountryState 'US', 'VI', 'VIRGIN ISLANDS'
EXECUTE InsertOrUpdateCountryState 'US', 'VT', 'VERMONT'
EXECUTE InsertOrUpdateCountryState 'US', 'WA', 'WASHINGTON'
EXECUTE InsertOrUpdateCountryState 'US', 'WI', 'WISCONSIN'
EXECUTE InsertOrUpdateCountryState 'US', 'WV', 'WEST VIRGINIA'
EXECUTE InsertOrUpdateCountryState 'US', 'WY', 'WYOMING'
EXECUTE InsertOrUpdateCountryState 'US', 'UM', 'United States Minor Outlying Islands'

--Australia
EXECUTE InsertOrUpdateCountryAddressLabel 'AU', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'AU', 'City', 'City'
EXECUTE InsertOrUpdateCountryAddressLabel 'AU', 'ZipCode', 'PostalCode'
EXECUTE InsertOrUpdateCountryAddressLabel 'AU', 'StateCode', 'State'

EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'AU', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'AU', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'StateCode', 'Required', 'Required'

EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'AU', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'AU', 'ZipCode', 'RegularExpression', 'Pattern', '^[1-9][0-9]{3}$'

--Belgium
EXECUTE InsertOrUpdateCountryAddressLabel 'BE', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'BE', 'City', 'Locality'
EXECUTE InsertOrUpdateCountryAddressLabel 'BE', 'ZipCode', 'PostalCode'

EXECUTE InsertOrUpdateCountryAddressRule 'BE', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'BE', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'BE', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'BE', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'BE', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'BE', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'BE', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'BE', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'BE', 'ZipCode', 'RegularExpression', 'Pattern', '^[1-9][0-9]{3}$'

--Brazil
EXECUTE InsertOrUpdateCountryAddressLabel 'BR', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'BR', 'City', 'Locality'
EXECUTE InsertOrUpdateCountryAddressLabel 'BR', 'ZipCode', 'PostalCode'
EXECUTE InsertOrUpdateCountryAddressLabel 'BR', 'StateCode', 'Province'

EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'BR', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'BR', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'StateCode', 'Required', 'Required'

EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'BR', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'BR', 'ZipCode', 'RegularExpression', 'Pattern', '^[1-9][0-9]{4}-[1-9][0-9]{3}$'

--Canada
EXECUTE InsertOrUpdateCountryAddressLabel 'CA', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'CA', 'City', 'City'
EXECUTE InsertOrUpdateCountryAddressLabel 'CA', 'ZipCode', 'PostalCode'
EXECUTE InsertOrUpdateCountryAddressLabel 'CA', 'StateCode', 'Province'

EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'CA', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'CA', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'StateCode', 'Required', 'Required'

EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'CA', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'CA', 'ZipCode', 'RegularExpression', 'Pattern', '^[A-Z]\d[A-Z] \d[A-Z]\d$'

--Czech Republic
EXECUTE InsertOrUpdateCountryAddressLabel 'CZ', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'CZ', 'City', 'City'
EXECUTE InsertOrUpdateCountryAddressLabel 'CZ', 'ZipCode', 'PostalCode'

EXECUTE InsertOrUpdateCountryAddressRule 'CZ', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'CZ', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'CZ', 'Line1', 'MaxLength', 'Max', '10'

EXECUTE InsertOrUpdateCountryAddressRule 'CZ', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'CZ', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'CZ', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'CZ', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'CZ', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'CZ', 'ZipCode', 'RegularExpression', 'Pattern', '^\d{3} ?\d{2}$'

--India
EXECUTE InsertOrUpdateCountryAddressLabel 'IN', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'IN', 'County', 'DependentLocality'
EXECUTE InsertOrUpdateCountryAddressLabel 'IN', 'City', 'Locality'
EXECUTE InsertOrUpdateCountryAddressLabel 'IN', 'ZipCode', 'PostalCode'

EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'IN', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'County', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'County', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'IN', 'County', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'IN', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'IN', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'IN', 'ZipCode', 'RegularExpression', 'Pattern', '^[1-9][0-9]{2} -| |[1-9][0-9]{2}$'

--Mexico
EXECUTE InsertOrUpdateCountryAddressLabel 'MX', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'MX', 'City', 'City'
EXECUTE InsertOrUpdateCountryAddressLabel 'MX', 'ZipCode', 'PostalCode'
EXECUTE InsertOrUpdateCountryAddressLabel 'MX', 'StateCode', 'Province'

EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'MX', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'MX', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'StateCode', 'Required', 'Required'

EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'MX', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'MX', 'ZipCode', 'RegularExpression', 'Pattern', '^[1-9][0-9]{4}$'


--Singapore
EXECUTE InsertOrUpdateCountryAddressLabel 'SG', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'SG', 'City', 'Locality'
EXECUTE InsertOrUpdateCountryAddressLabel 'SG', 'ZipCode', 'PostalCode'

EXECUTE InsertOrUpdateCountryAddressRule 'SG', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'SG', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'SG', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'SG', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'SG', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'SG', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'SG', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'SG', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'SG', 'ZipCode', 'RegularExpression', 'Pattern', '^[1-9][0-9]$'


--Great Britain
EXECUTE InsertOrUpdateCountryAddressLabel 'GB', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'GB', 'County', 'Locality'
EXECUTE InsertOrUpdateCountryAddressLabel 'GB', 'City', 'PostTown'
EXECUTE InsertOrUpdateCountryAddressLabel 'GB', 'ZipCode', 'PostCode'

EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'GB', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'County', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'GB', 'County', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'GB', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'GB', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'GB', 'ZipCode', 'RegularExpression', 'Pattern', '^[A-Z]{1,2}\d[A-Z\d]? \d[ABD-HJLNP-UW-Z]{2}$'

--United States
EXECUTE InsertOrUpdateCountryAddressLabel 'US', 'Line1', 'Line1'
EXECUTE InsertOrUpdateCountryAddressLabel 'US', 'County', 'County'
EXECUTE InsertOrUpdateCountryAddressLabel 'US', 'City', 'City'
EXECUTE InsertOrUpdateCountryAddressLabel 'US', 'ZipCode', 'ZipCode'
EXECUTE InsertOrUpdateCountryAddressLabel 'US', 'StateCode', 'State'

EXECUTE InsertOrUpdateCountryAddressRule 'US', 'Line1', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'US', 'Line1', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'US', 'Line1', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'US', 'County', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'US', 'County', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'US', 'City', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'US', 'City', 'MaxLength', 'MaxLengthBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'US', 'City', 'MaxLength', 'Max', '50'

EXECUTE InsertOrUpdateCountryAddressRule 'US', 'StateCode', 'Required', 'Required'

EXECUTE InsertOrUpdateCountryAddressRule 'US', 'ZipCode', 'Required', 'Required'
EXECUTE InsertOrUpdateCountryAddressRule 'US', 'ZipCode', 'RegularExpression', 'FormatBroken'
EXECUTE InsertOrUpdateCountryAddressRuleParameter 'US', 'ZipCode', 'RegularExpression', 'Pattern', '^\d{5}(-(\d{4}|\d{6}))?$'

Rozložení adres

U zadávání adres pro každou zemi je obvykle potřeba různý počet vstupních polí - například u nás v ČR se nepožívá výběr jednotlivých států (či okresů, provincií) - tedy nezadáváme jestli je adresa v Jihomoravském kraji či Vysočině. Oproti tomu v Kanadě se zadává provincie, v Austrálii či USA teritorium apod. Sestavovat dynamicky takový formulář by bylo náročné a tak jsem si práci zjednodušil a vytvořil si tři možné rozložení adres:

Layout 1

Layout 2

Layout 3

Samozřejmě podobné rozdělení vedu i u šablon pro zobrazení již zadaných údajů-

Jak na to v MVC

Doposud byly v naší aplikaci pro prosazení pravidel používány atributy. Ale jsou i jiné možnosti - tyhle atributy totiž nejsou povinné - ale MVC je využije, když si vytváří MetadataModel pro naše třídy. Ale tento model můžeme vytvořit i jinak a bez atributů - třebas na základě údajů z databáze. A pro tento účel jsou vhodné  třídy ModelMetadataProvider a ModelValidatorProvider, respektive třídy z nich odvozené.

V příštím díle pak ukážu jak na to.

Žádné komentáře:

Okomentovat