Usare il componente router Blazor per controllare lo spostamento all'interno dell'app

Completato

Il sistema di routing in Blazor offre opzioni flessibili per garantire che le richieste degli utenti raggiungano un componente in grado di gestirle e restituire le informazioni desiderate dall'utente.

Si supponga di lavorare al sito Web di una pizzeria che fa pizze da asporto. Si vuole configurare il sito in modo che le richieste dei dettagli delle pizze e dei dettagli dei condimenti personalizzati vengano gestiti dallo stesso componente. Questa fase è stata completata, ma in fase di test si scopre che le richieste relative ai condimenti ricevono un messaggio di errore. È necessario risolvere il problema.

In questo articolo viene descritto come configurare le route in Blazor usando la direttiva @page.

Nota

I blocchi di codice in questa unità sono esempi illustrativi. Nell’unità successiva, si scrive il proprio codice.

Usare modelli di route

Quando effettua una richiesta per una pagina dall'app Web, l'utente può specificare ciò che vuole visualizzare con le informazioni nell'URI. Ad esempio:

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

Dopo il protocollo e l'indirizzo del sito Web, questo URI indica che l'utente vuole informazioni sulle pizze margherita. Inoltre, la stringa di query dopo il punto interrogativo mostra che l'utente è interessato all'aggiunta di ananas. In Blazor si usa il routing per garantire che ogni richiesta venga inviata al componente che può rispondere al meglio. È anche possibile usare il routing per garantire che il componente disponga di tutte le informazioni necessarie per visualizzare gli elementi desiderati dall'utente. In questo caso, si vuole inviare la richiesta al componente Pizzas e che tale componente visualizzi una pizza margherita con informazioni sull'aggiunta di ananas.

Blazor instrada le richieste con un componente specializzato denominato Router. Il componente è configurato in App.razor come segue:

<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>

All'avvio dell'app, Blazor controlla l'attributo AppAssembly per scoprire quale assembly deve analizzare. Analizza l'assembly alla ricerca di componenti contenenti RouteAttribute. Blazor usa questi valori per compilare un oggetto RouteData che specifica come vengono instradate le richieste ai componenti. Quando si scrive il codice dell'app, usare la direttiva @page in ogni componente per correggere RouteAttribute.

Nel codice precedente il tag <Found> specifica il componente che gestisce il routing in fase di esecuzione, vale a dire il componente RouteView. Questo componente riceve l'oggetto RouteData e tutti i parametri dall'URI o dalla stringa di query. Esegue quindi il rendering del componente specificato e del relativo layout. È possibile usare il tag <Found> per specificare un layout predefinito, che viene usato quando il componente selezionato non specifica un layout con la direttiva @layout. Altre informazioni sui layout vengono fornite più avanti in questo modulo.

Nel componente <Router> è possibile specificare anche ciò che viene restituito all'utente quando non viene trovata una route corrispondente. In questo caso si usa il tag <NotFound>. L'esempio precedente restituisce un singolo paragrafo <p>, ma è possibile eseguire il rendering di HTML più complesso. Ad esempio, potrebbe includere un collegamento alla home page o a una pagina di contatto per gli amministratori del sito.

Usare la direttiva @page

In un componente Blazor, la direttiva @page specifica che il componente deve gestire le richieste direttamente. È possibile specificare un elemento RouteAttribute nella direttiva @page passandolo come stringa. Ad esempio, questo attributo specifica che la pagina gestisce le richieste per la route /Pizzas:

@page "/Pizzas"

Se si desidera specificare più route al componente, usare due o più direttive @page:

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

Acquisire informazioni sulla posizione e spostarsi con NavigationManager

Si supponga di scrivere un componente per gestire l’URI che l'utente richiede, ad esempio http://www.contoso.com/pizzas/margherita/?extratopping=pineapple.

Quando si scrive un componente, potrebbe essere necessario accedere a informazioni di spostamento come:

  • L'URI completo corrente, ad esempio http://www.contoso.com/pizzas/margherita?extratopping=pineapple.
  • L'URI di base, ad esempio http://www.contoso.com/.
  • Il percorso relativo di base, ad esempio pizzas/margherita.
  • La stringa di query, ad esempio ?extratopping=pineapple.

È possibile usare un oggetto NavigationManager per ottenere tutti questi valori. È necessario inserire l'oggetto nel componente e successivamente si può accedere alle relative proprietà. Questo codice usa l'oggetto NavigationManager per ottenere l'URI di base del sito Web e quindi lo usa per impostare un collegamento alla home page:

@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;
    }
}

Per accedere alla stringa di query, è necessario analizzare l'URI completo. Per eseguire questa analisi, usare la classe QueryHelpers dell’assembly Microsoft.AspNetCore.WebUtilities:

@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);
        }
    }
}

Con il componente precedente distribuito, se un utente richiedesse l'URI http://www.contoso.com/pizzas?extratopping=Pineapple, visualizzerebbe il messaggio "Voglio aggiungere questo condimento: Ananas" nella pagina risultante dal rendering.

È anche possibile usare l'oggetto NavigationManager per indirizzare gli utenti a un altro componente nel codice chiamando il metodo NavigationManager.NavigateTo():

@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");
    }
}

Nota

La stringa che si passa al metodo NavigateTo() è l'URI assoluto o relativo a cui si vuole indirizzare l'utente. Assicurarsi che vi sia un componente configurato a tale indirizzo. Per il codice precedente, un componente con la direttiva @page "/buypizza" gestirà questa route.

In uno degli esempi precedenti, il codice è stato usato per ottenere il valore NavigationManager.BaseUri e usarlo per impostare l'attributo href di un tag <a> alla home page. In Blazor, usare il componente NavLink per eseguire il rendering dei tag <a> in quanto passa a una classe CSS active quando l'attributo href del collegamento corrisponde all'URL corrente. Impostando lo stile della classe active, è possibile chiarire all'utente quale collegamento di spostamento è per la pagina corrente.

Quando si usa NavLink, l'esempio di collegamento alla home page è simile al codice seguente:

@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;
    }
}

L'attributo Match nel componente NavLink viene usato per gestire quando il collegamento viene evidenziato. Sono disponibili due opzioni:

  • NavLinkMatch.All: quando si usa questo valore, il collegamento viene evidenziato come collegamento attivo solo quando href corrisponde all'intero URL corrente.
  • NavLinkMatch.Prefix: quando si usa questo valore, il collegamento viene evidenziato come attivo quando href corrisponde alla prima parte dell'URL corrente. Si supponga, ad esempio, di avere il collegamento <NavLink href="pizzas" Match="NavLinkMatch.Prefix">. Questo collegamento verrebbe evidenziato come attivo quando l'URL corrente fosse http://www.contoso.com/pizzas e per qualsiasi posizione all'interno di tale URL, ad esempio http://www.contoso.com/pizzas/formaggio. Questo comportamento aiuta l'utente a comprendere quale sezione del sito Web sta attualmente visualizzando.

Verificare le conoscenze

1.

Quale componente si usa per ottenere informazioni sulla posizione URI all'interno di un componente Blazor?

2.

Qual è la classe CSS predefinita aggiunta a un tag di ancoraggio dal componente NavLink quando NavLink fa riferimento all'URL corrente?