Řízení navigace v aplikaci pomocí komponenty Směrovač Blazor

Dokončeno

Systém směrování Blazor nabízí flexibilní možnosti pro zajištění toho, aby požadavky uživatelů dosáhly komponenty, která je dokáže zpracovat, a vrací informace, které chce uživatel.

Předpokládejme, že pracujete na webu společnosti pro doručování pizzy. Chcete nastavit web tak, aby žádosti o podrobnosti o pizzě a podrobnosti o vlastním zastavení byly zpracovávány stejnou komponentou. Tuto fázi jste dokončili, ale testování ukazuje, že se při zastavení požadavků zobrazuje chybová zpráva. Tento problém je potřeba vyřešit.

Tady se dozvíte, jak nakonfigurovat trasy v Blazoru pomocí direktivy @page .

Poznámka:

Bloky kódu v této lekci jsou ilustrativní příklady. V další lekci napíšete vlastní kód.

Použití šablon tras

Když uživatel vytvoří požadavek na stránku z vaší webové aplikace, může určit, co chce zobrazit s informacemi v identifikátoru URI. Příklad:

http://www.contoso.com/pizzas/margherita?extratopping=pineapple

Po protokolu a adrese webu tento identifikátor URI označuje, že uživatel chce vědět o margherita pizzas. Řetězec dotazu za otazníkem také ukazuje, že se zajímá o další zastavení ananasu. V Blazoru použijete směrování, abyste zajistili, že se každý požadavek odešle do komponenty, která dokáže nejlépe reagovat. Pomocí směrování také zajistíte, že komponenta obsahuje všechny informace, které potřebuje k zobrazení požadovaných uživatelů. V takovém případě můžete chtít odeslat požadavek na komponentu Pizzas a pro tuto komponentu zobrazit pizzu margherita s informacemi o přidání ananasu.

Blazor směruje požadavky se specializovanou komponentou nazvanou Router . Komponenta se konfiguruje v App.razoru takto:

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
    <NotFound>
        <p>Sorry, we haven't found any pizzas here.</p>
    </NotFound>
</Router>

Když se aplikace spustí, Blazor zkontroluje AppAssembly atribut a zjistí, které sestavení má prohledávat. Zkontroluje, jestli sestavení obsahuje komponenty, které mají atribut RouteAttribute . Blazor tyto hodnoty používá ke kompilaci objektu RouteData , který určuje, jak se požadavky směrují do komponent. Při kódování aplikace použijete direktivu @page v každé komponentě k opravě RouteAttribute.

V předchozím kódu značka určuje komponentu, <Found> která zpracovává směrování za běhu: komponentu RouteView . Tato komponenta přijímá objekt RouteData a všechny parametry z identifikátoru URI nebo řetězce dotazu. Potom vykreslí zadanou komponentu a její rozložení. Značku můžete použít <Found> k určení výchozího rozložení, které se použije, když vybraná komponenta nezadá rozložení s direktivou @layout . Další informace o rozloženích se dozvíte později v tomto modulu.

V komponentě <Router> můžete také určit, co se uživateli vrátí, pokud neexistuje odpovídající trasa, pomocí značky <NotFound> . Předchozí příklad vrátí jeden <p> odstavec, ale můžete vykreslit složitější HTML. Může například obsahovat odkaz na domovskou stránku nebo kontaktní stránku pro správce webu.

Použití direktivy @page

V komponentě Blazor direktiva @page určuje, že komponenta by měla zpracovávat požadavky přímo. RouteAttribute v direktivě @page můžete zadat tak, že ji předáte jako řetězec. Tento atribut například určuje, že stránka zpracovává požadavky na trasu /Pizzas :

@page "/Pizzas"

Pokud chcete zadat více než jednu trasu ke komponentě, použijte dvě nebo více @page direktiv, například v tomto příkladu:

@page "/Pizzas"
@page "/CustomPizzas"

Získání informací o poloze a navigace pomocí NavigationManageru

Předpokládejme, že napíšete komponentu pro zpracování identifikátoru URI, který uživatel požaduje, například http://www.contoso.com/pizzas/margherita/?extratopping=pineapple.

Při psaní komponenty možná budete potřebovat přístup k navigačním informacím, například:

  • Aktuální úplný identifikátor URI, například http://www.contoso.com/pizzas/margherita?extratopping=pineapple.
  • Základní identifikátor URI, například http://www.contoso.com/.
  • Základní relativní cesta, například pizzas/margherita.
  • Řetězec dotazu, například ?extratopping=pineapple.

K získání všech těchto hodnot můžete použít NavigationManager objekt. Objekt je nutné vložit do komponenty a pak získat přístup k jeho vlastnostem. Tento kód pomocí objektu NavigationManager získá základní identifikátor URI webu a pak ho použije k nastavení odkazu na domovskou stránku:

@page "/pizzas"
@inject NavigationManager NavManager

<h1>Buy a Pizza</h1>

<p>I want to order a: @PizzaName</p>

<a href=@HomePageURI>Home Page</a>

@code {
    [Parameter]
    public string PizzaName { get; set; }
    
    public string HomePageURI { get; set; }
    
    protected override void OnInitialized()
    {
        HomePageURI = NavManager.BaseUri;
    }
}

Pokud chcete získat přístup k řetězci dotazu, musíte analyzovat úplný identifikátor URI. K provedení této analýzy použijte QueryHelpers třídu ze Microsoft.AspNetCore.WebUtilities sestavení:

@page "/pizzas"
@using Microsoft.AspNetCore.WebUtilities
@inject NavigationManager NavManager

<h1>Buy a Pizza</h1>

<p>I want to order a: @PizzaName</p>

<p>I want to add this topping: @ToppingName</p>

@code {
    [Parameter]
    public string PizzaName { get; set; }
    
    private string ToppingName { get; set; }
    
    protected override void OnInitialized()
    {
        var uri = NavManager.ToAbsoluteUri(NavManager.Uri);
        if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("extratopping", out var extraTopping))
        {
            ToppingName = System.Convert.ToString(extraTopping);
        }
    }
}

Pokud uživatel požádal o identifikátor URI http://www.contoso.com/pizzas?extratopping=Pineapple, při nasazení předchozí komponenty by se na vykreslené stránce zobrazila zpráva "Chci přidat toto zastavení: Pineapple".

Objekt můžete také použít NavigationManager k odeslání uživatelů do jiné komponenty v kódu voláním NavigationManager.NavigateTo() metody:

@page "/pizzas/{pizzaname}"
@inject NavigationManager NavManager

<h1>Buy a Pizza</h1>

<p>I want to order a: @PizzaName</p>

<button class="btn" @onclick="NavigateToPaymentPage">
    Buy this pizza!
</button>

@code {
    [Parameter]
    public string PizzaName { get; set; }
    
    private void NavigateToPaymentPage()
    {
        NavManager.NavigateTo("buypizza");
    }
}

Poznámka:

Řetězec, který předáte NavigateTo() metodě, je absolutní nebo relativní identifikátor URI, kam chcete odeslat uživatele. Ujistěte se, že máte na této adrese nastavenou komponentu. Pro předchozí kód bude komponenta s direktivou zpracovávat tuto trasu @page "/buypizza" .

V jednom z předchozích příkladů byl kód použit k získání NavigationManager.BaseUri hodnoty a jeho použití k nastavení href atributu <a> značky na domovskou stránku. V Blazoru pomocí komponenty NavLink vykreslujte <a> značky, protože přepíná active třídu CSS, když atribut odkazu href odpovídá aktuální adrese URL. Když třídu napíšete active , můžete uživateli smazat, který navigační odkaz je určen pro aktuální stránku.

Když použijete NavLink, příklad odkazu na domovskou stránku vypadá jako následující kód:

@page "/pizzas"
@inject NavigationManager NavManager

<h1>Buy a Pizza</h1>

<p>I want to order a: @PizzaName</p>

<NavLink href=@HomePageURI Match="NavLinkMatch.All">Home Page</NavLink>

@code {
    [Parameter]
    public string PizzaName { get; set; }
    
    public string HomePageURI { get; set; }
    
    protected override void OnInitialized()
    {
        HomePageURI = NavManager.BaseUri;
    }
}

Atribut Match v komponentě NavLink slouží ke správě, když je odkaz zvýrazněný. Existují dvě možnosti:

  • NavLinkMatch.All: Když použijete tuto hodnotu, odkaz se zvýrazní jenom jako aktivní odkaz, pokud se shoduje href s celou aktuální adresou URL.
  • NavLinkMatch.Prefix: Když použijete tuto hodnotu, odkaz se zvýrazní jako aktivní, když odpovídá href první části aktuální adresy URL. Předpokládejme například, že jste měli odkaz <NavLink href="pizzas" Match="NavLinkMatch.Prefix">. Tento odkaz by se zvýraznil jako aktivní, když byla http://www.contoso.com/pizzas aktuální adresa URL a pro jakékoli umístění v této adrese URL, například http://www.contoso.com/pizzas/formaggio. Toto chování může uživateli pomoct pochopit, kterou část webu si právě prohlíží.

Kontrola znalostí

1.

Jakou komponentu byste měli použít k získání informací o umístění identifikátoru URI uvnitř komponenty Blazor?

2.

Jaká je výchozí třída CSS přidaná do značky ukotvení komponentou NavLink, když NavLink odkazuje na aktuální adresu URL?