Při vývoji webových aplikací je lokalizace uživatelského rozhraní jedním z klíčových aspektů, který ovlivňuje, jak uživatelé interagují s aplikací na základě jejich jazykových a regionálních preferencí. ASP.NET Core 7 nabízí výkonné nástroje pro implementaci lokalizace, přičemž jedním z nich je správné nastavení hlavičky Accept-Language a používání Tag Helperů pro snadnou manipulaci s HTML značkami.

Představme si, že uživatelé používají různé jazykové verze prohlížeče, což může mít vliv na obsah, který se zobrazí na webové stránce. Když například přidáme francouzštinu jako preferovaný jazyk ve Chrome, je třeba změnit nastavení, aby byla aplikace schopná přepnout na správné jazykové a regionální formáty. Pro tento účel je možné v nastavení prohlížeče přidat jazykové možnosti jako "fr-FR" pro francouzštinu v Francii nebo "en-US" pro angličtinu v USA. Jakmile uživatel nastaví své preferované jazyky a zavře nastavení, po obnovení stránky se automaticky použijí lokalizované popisky a formáty dat a měny.

Jedním z klíčových nástrojů pro lokalizaci v ASP.NET Core je hlavička Accept-Language, která určuje, jaké jazykové verze budou použity při komunikaci mezi klientem a serverem. Příklad hlavičky může vypadat takto: Accept-Language: en-US,en;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-GB;q=0.6. Tato hlavička specifikuje, že angličtina (USA) má nejvyšší prioritu, následovaná obecnou angličtinou, francouzštinou (Francie), obecnou francouzštinou a angličtinou (Velká Británie). Každý jazyk je přiřazený k hodnotě kvality (od 0 do 1), která určuje, jak silně preferovanou jazykovou verzi si uživatel přeje.

Dalším důležitým nástrojem pro práci s HTML v ASP.NET Core jsou Tag Helper, které usnadňují práci s dynamickými HTML elementy. Tag Helper fungují na úrovni atributů HTML a umožňují čistší a čitelnější kód než tradiční HTML Helper metody. Například, pro vytvoření odkazu na akci kontroléru v klasickém HTML kódu bychom použili:

html
@Html.ActionLink("View our privacy policy.", "Privacy", "Index")

Nicméně použití Tag Helper je mnohem přehlednější a snadněji se s ním pracuje, zejména pro vývojáře, kteří se více zaměřují na HTML, CSS a JavaScript, než na C#. Příklad Tag Helper pro stejný odkaz vypadá takto:

html
<a asp-action="Privacy" asp-controller="Index">View our privacy policy.</a>

Tag Helper nevyžaduje znalost C#, stačí používat běžné HTML atributy, což zjednodušuje práci pro front-end vývojáře.

Pro konkrétní příklad použití Tag Helper, v aplikaci můžeme vytvořit odkazy stylované jako tlačítka pro zobrazení objednávek pro jednotlivé zákazníky nebo podle zemí. Tag Helper umožňuje snadno předávat parametry pomocí atributů jako asp-route-id nebo asp-route-country, což výrazně zjednodušuje práci s dynamickými odkazy. Tento přístup usnadňuje čitelnost kódu a zároveň podporuje flexibilitu aplikace.

Pokud se podíváme na praktické využití Tag Helperů, například v rámci projektu jako je Northwind.Mvc, můžeme upravit soubor Privacy.cshtml tak, že přidáme odkazy s parametry pro filtrování objednávek podle zákazníků a zemí. V kontroléru HomeController.cs pak definujeme metodu akce, která přijímá volitelné parametry a použije je k filtrování dat, což umožní uživateli snadno procházet objednávky podle specifických kritérií.

Na konci tohoto procesu je důležité pochopit, že správná lokalizace a použití Tag Helperů nejen že zjednodušuje vývoj, ale také zajišťuje, že aplikace bude efektivně fungovat pro širokou škálu uživatelů po celém světě. Kromě základních funkcí lokalizace a tagování, by si vývojář měl být vědom potřeby testování těchto funkcí na více zařízeních a prohlížečích, aby zajistil, že aplikace bude správně zobrazovat obsah podle jazykových preferencí uživatele.

Jak správně pracovat s komponentami v Blazor WebAssembly a implementovat validaci dat

V práci s Blazor WebAssembly je jedním z klíčových aspektů správné použití typů a validace dat. Například v rámci komponent, které používají specifické datové typy jako datetime, decimal, double, nebo Guid, je důležité zajistit, aby všechny vlastnosti byly správně definovány a odpovídaly požadovaným formátům. Pro každý datový typ existují specifické požadavky. Například vlastnost {hiredate:datetime} musí obsahovat platnou hodnotu data a času, {price:decimal} požaduje platnou hodnotu v desítkovém formátu, a {orderid:guid} musí být validní identifikátor ve formátu GUID.

Tento princip platí nejen pro backendové validace, ale i pro samotné URL a navigaci v rámci aplikace. Pokud jsou například parametry typu datum a čas odesílány v URL, je důležité používat invariantní formát kultury, aby se zajistilo, že formát data bude vždy správně interpretován. Tím se vyhneme problémům s lokalizací, kdy by se formát mohl v různých kulturních nastaveních lišit.

V rámci komponent Blazor se běžně využívá základní třída ComponentBase, kterou všechny komponenty automaticky dědí. Tato třída definuje metody pro správu životního cyklu komponenty, jako je OnInitialized, OnAfterRender, nebo OnParametersSet. Při vývoji komponent v Blazor WebAssembly je nezbytné porozumět tomu, jak a kdy tyto metody přepsat, aby bylo možné správně reagovat na změny parametrů, inicializaci komponenty nebo její renderování.

Například metoda OnParametersSet je volána po každém přiřazení parametrů komponenty a je to ideální místo pro přidání logiky, která reaguje na změny parametrů. Pokud je potřeba provádět asynchronní operace, je vhodné použít varianty těchto metod s příponou Async, jako je OnParametersSetAsync. Důležité je také použít metodu StateHasChanged, která signalizuje komponentě, že je nutné ji znovu vykreslit, což je nezbytné pro aktualizaci zobrazených dat.

V Blazor WebAssembly je také možnost používat sdílené layouty mezi komponentami. Tento přístup je velmi podobný MVC pohledům nebo Razor Pages, kde komponenty dědí základní layouty a využívají vlastnost Body pro zobrazení specifického obsahu. Layout pro komponenty lze nastavit nejen na úrovni jednotlivých komponent, ale také globálně v souboru App.razor, kde se určuje výchozí layout pro aplikaci.

Blazor nabízí robustní systém pro navigaci mezi stránkami pomocí NavigationManager a komponenty NavLink. Tato komponenta má tu výhodu, že automaticky nastaví svou třídu na active, pokud odpovídá aktuální URL, což výrazně zjednodušuje práci s navigačními odkazy. Je důležité si uvědomit, že výchozí algoritmus pro porovnávání URL u NavLink používá prefix cesty, což znamená, že cesta /employees bude aktivní i pro adresy jako /employees/USA nebo /employees/UK/London. Pokud je požadováno přesné porovnání celého URL, je třeba použít parametr NavLinkMatch.All.

Vytváření Blazor komponent zahrnuje i nastavení správného projektu. Pro nový Blazor WebAssembly projekt v ASP.NET Core 7 je třeba vytvořit prázdný projekt, který obsahuje základní komponenty jako Counter nebo FetchData. Tento projekt slouží jako výchozí bod, ke kterému můžeme přidávat další komponenty a služby. Při vytváření projektu se doporučuje nastavit ho pro HTTPS a zvolit možnost ASP.NET Core Hosting, což zajišťuje správnou funkčnost serveru pro hostování Blazor aplikace.

V prostředí Blazor WebAssembly může být rovněž užitečné nastavení serveru pro obsluhu souborů Blazor frameworku a statických souborů, jako je index.html. Tento soubor je klíčový pro správnou inicializaci aplikace ve webovém prohlížeči a musí být přítomen v projektu, aby aplikace mohla být správně načtena.

Pro vývojáře, kteří začínají s Blazor WebAssembly, je důležité mít na paměti strukturu aplikace. Při vytváření projektu se automaticky vytvoří tři základní projekty: klient, server a sdílený projekt. Klientský projekt je ten, který obsahuje Blazor WebAssembly aplikaci a může být nasazen samostatně. Serverový projekt hostuje aplikaci a poskytuje API pro klienta, zatímco sdílený projekt obsahuje kód, který je používán v obou předchozích projektech.

Při implementaci metod v Program.cs serverového projektu je kladeno důraz na konfiguraci pro spuštění Blazor WebAssembly. Tato konfigurace zahrnuje například nastavení pro ladění WebAssembly, obsluhu souborů frameworku a správné mapování statických souborů.

Je nezbytné, aby vývojáři vnímali správnou strukturu a organizaci souborů a věnovali pozornost detailům, jakým způsobem je server nakonfigurován, aby podporoval správné fungování Blazor aplikace.

Jak implementovat MVVM a práci s kategoriemi v .NET MAUI a Blazor aplikaci

V této kapitole se podíváme na to, jak implementovat MVVM (Model-View-ViewModel) a efektivně pracovat s kategoriemi v aplikaci .NET MAUI s použitím Blazoru. Tato implementace vyžaduje vytvoření modelu a ViewModelu, které budou komunikovat s webovým službami a dynamicky zobrazovat kategorie v aplikaci.

Prvním krokem je přidání potřebných referencí na balíčky pro .NET MAUI Community Toolkit a MVVM Community Toolkit. Tyto nástroje poskytují šablony a pomocné třídy, které usnadní práci s MVVM architekturou. Po přidání těchto balíčků je nutné projekt sestavit, aby se stáhly všechny závislosti.

Ve třetím kroku, v souboru MauiProgram.cs, přidáme volání na rozšiřující metodu, která umožní používání .NET MAUI Community Toolkit. Tato metoda aktivuje knihovnu pro správu rozhraní a umožní snadnější práci s komponentami, jako jsou například fonty a další nástroje, které využíváme v aplikaci.

Dalším krokem je vytvoření modelu kategorie, který bude reprezentovat entitu kategorie v aplikaci. Tento model bude obsahovat vlastnosti jako CategoryId, CategoryName, Description, Picture, a PicturePath. Kromě standardních vlastností bude přidána vlastnost PicturePath, která bude generovat cestu k obrázku na základě ID kategorie. Tento obrázek bude alternativa k uloženým datům obrázku v databázi, což zjednodušuje práci s obrázky v aplikaci a šetří místo.

Pro implementaci tohoto modelu použijeme knihovnu CommunityToolkit.Mvvm.ComponentModel a anotace jako [ObservableProperty], které nám umožní jednoduše sledovat změny v těchto vlastnostech a automaticky je aktualizovat v uživatelském rozhraní. Když se hodnota CategoryId změní, automaticky se aktualizuje i hodnota PicturePath, což zajistí, že uživatel vždy uvidí správný obrázek pro každou kategorii.

Následně vytvoříme ViewModel pro práci s kategoriemi, který bude dědit z ObservableCollection<Category>. Tento ViewModel bude spravovat seznam kategorií, který načítáme z webové služby. Ve ViewModelu také definujeme příkazy (commands), které budou reagovat na akce uživatele, jako je přidání kategorie do oblíbených nebo její smazání. Data pro kategorie získáme prostřednictvím HTTP požadavku na REST API, kde obdržíme seznam kategorií, který následně zpracujeme a přidáme do kolekce kategorií.

V kódu pro ViewModel je například použití HttpClient pro odeslání požadavku na server, kde získáme JSON data, která následně deserializujeme do seznamu kategorií. Každá kategorie bude mít upravený obrázek, který je vyčištěný od hlaviček a uložený jako pole bytů, a následně bude generována cesta k obrázku podle jejího ID.

Další důležitou součástí této aplikace je zobrazení kategorií na stránce pomocí komponenty Carousel, která umožňuje zobrazit více položek v horizontálním posuvu s indikátory, které uživateli ukazují, která kategorie je právě zobrazená. Také je zde přidáno zobrazení chybových hlášení, pokud dojde k nějaké chybě při načítání dat z webového API.

Tato implementace ukazuje, jak efektivně používat MVVM architekturu a jak pracovat s externími datovými zdroji v prostředí .NET MAUI a Blazor. Použití knihoven jako CommunityToolkit.Mvvm značně zjednodušuje práci s databázovými modely a ViewModely, což vede k čistému a efektivnímu kódu.

Při práci s kategoriemi a webovými službami je důležité zajistit správnou manipulaci s daty, jejich validaci a správné ošetření chybových stavů, které mohou nastat při komunikaci se serverem. Je třeba si uvědomit, že každý vývojový krok by měl být testován nejen pro správnost výpočtů, ale i pro uživatelskou zkušenost, aby aplikace byla intuitivní a funkční.