Cvičení – použití parametrů trasy ke zlepšení navigace v aplikacích

Dokončeno

Parametry trasy Blazor umožňují komponentám přistupovat k datům předávaným v adrese URL. Parametry trasy umožňují naší aplikaci přistupovat ke konkrétním objednávkám podle jejich OrderId.

Zákazníci chtějí zobrazit další informace o konkrétních objednávkách. Takže se rozhodnete aktualizovat stránku pokladny tak, aby zákazníky přímo převezli na jejich objednávky. Potom chcete aktualizovat stránku objednávek, aby mohla sledovat jakoukoli aktuálně otevřenou objednávku.

V tomto cvičení přidáte novou stránku podrobností objednávky, která využívá parametry trasy. Pak uvidíte, jak můžete k parametru přidat omezení, abyste zkontrolovali správný datový typ.

Vytvoření stránky podrobností objednávky

  1. V editoru Visual Studio Code v nabídce vyberte Soubor>nový textový soubor.

  2. Jako jazyk vyberte ASP.NET Razor.

  3. Vytvořte součást stránky podrobností objednávky s tímto kódem:

    @page "/myorders/{orderId}"
    @inject NavigationManager NavigationManager
    @inject HttpClient HttpClient
    
    <div class="top-bar">
        <a class="logo" href="">
            <img src="img/logo.svg" />
        </a>
    
        <NavLink href="" class="nav-tab" Match="NavLinkMatch.All">
            <img src="img/pizza-slice.svg" />
            <div>Get Pizza</div>
        </NavLink>
    
        <NavLink href="myorders" class="nav-tab">
            <img src="img/bike.svg" />
            <div>My Orders</div>
        </NavLink>
    
    </div>
    
    <div class="main">
        @if (invalidOrder)
        {
            <h2>Order not found</h2>
            <p>We're sorry but this order no longer exists.</p>
        }
        else if (orderWithStatus == null)
        {
            <div class="track-order">
                <div class="track-order-title">
                    <h2>
                      <text>Loading...</text>
                    </h2>
                    <p class="ml-auto mb-0">
                        ...
                    </p>
                </div>
            </div>
        }
        else
        {
            <div class="track-order">
                <div class="track-order-title">
                    <h2>
                        Order placed @orderWithStatus.Order.CreatedTime.ToLongDateString()
                    </h2>
                    <p class="ml-auto mb-0">
                        Status: <strong>@orderWithStatus.StatusText</strong>
                    </p>
                </div>
                <div class="track-order-body">
                    <div class="track-order-details">
                      @foreach (var pizza in orderWithStatus.Order.Pizzas)
                      {
                          <p>
                              <strong>
                                  @(pizza.Size)"
                                  @pizza.Special.Name
                                  (£@pizza.GetFormattedTotalPrice())
                              </strong>
                          </p>
                      }
                    </div>
                </div>
            </div>
        }
    </div>
    
    @code {
        [Parameter] public int OrderId { get; set; }
    
        OrderWithStatus orderWithStatus;
        bool invalidOrder = false;
    
        protected override async Task OnParametersSetAsync()
        {
          try
          {
              orderWithStatus = await HttpClient.GetFromJsonAsync<OrderWithStatus>(
                  $"{NavigationManager.BaseUri}orders/{OrderId}");
          }
          catch (Exception ex)
          {
              invalidOrder = true;
              Console.Error.WriteLine(ex);
          }
        }
    }
    
    

    Tato stránka vypadá podobně jako součást MyOrders . Voláme Na OrderController, ale tentokrát žádáme o konkrétní objednávku. Chceme ten, který odpovídá OrderId. Pojďme přidat kód, který zpracovává tento požadavek.

  4. Změny uložte tak, že vyberete Ctrl+S.

  5. Pro název souboru použijte OrderDetail.razor. Ujistěte se, že soubor uložíte v adresáři Stránky .

  6. V Průzkumníku souborů vyberte OrderController.cs.

  7. Pod metodu PlaceOrder přidejte novou metodu pro vrácení objednávek se stavem.

    [HttpGet("{orderId}")]
    public async Task<ActionResult<OrderWithStatus>> GetOrderWithStatus(int orderId)
    {
        var order = await _db.Orders
            .Where(o => o.OrderId == orderId)
            .Include(o => o.Pizzas).ThenInclude(p => p.Special)
            .Include(o => o.Pizzas).ThenInclude(p => p.Toppings).ThenInclude(t => t.Topping)
            .SingleOrDefaultAsync();
    
        if (order == null)
        {
            return NotFound();
        }
    
        return OrderWithStatus.FromOrder(order);
    }
    

    Tento kód povolil kontroleru objednávek reagovat na požadavek HTTP s orderId v adrese URL. Metoda pak použije toto ID k dotazování databáze a pokud je nalezena objednávka, vrátí OrderWithStatus objekt.

    Tuto novou stránku použijeme, když se zákazník přihlásí. Potřebujete aktualizovat komponentu Checkout.razor .

  8. V Průzkumníku souborů rozbalte stránky. Pak vyberte Checkout.razor.

  9. Změňte volání na následující, aby se použilo ID objednávky zadané objednávky.

    NavigationManager.NavigateTo($"myorders/{newOrderId}");
    

    Existující kód se už zachytával newOrderId jako odpověď od umístění objednávky. Teď ho můžete použít k přímému přechodu na tuto objednávku.

Omezení parametru trasy na správný datový typ

Aplikace by měla reagovat pouze na žádosti s ID číselných objednávek, například (http://localhost:5000/myorders/6). Nic nezastaví, aby se někdo pokusil použít nečíselné objednávky. Pojďme to změnit.

  1. V Průzkumníku souborů rozbalte stránky. Pak vyberte OrderDetail.razor.

  2. Změňte parametr trasy tak, aby komponenta přijímala pouze celá čísla.

    @page "/myorders/{orderId:int}"
    
  3. Pokud se teď někdo pokusí přejít,(http://localhost:5000/myorders/non-number) směrování Blazor nenajde shodu pro adresu URL a vrátí stránku, která nebyla nalezena.

    Snímek obrazovky se stránkou, která nebyla nalezena

  4. V editoru Visual Studio Code vyberte F5. Nebo v nabídce Spustit vyberte Spustit ladění.

    Snímek obrazovky zobrazující stránku objednávky podrobností pro jednu objednávku

    Projděte si aplikaci, objednávku a podívejte se. Přejdete na podrobnou obrazovku objednávky a zobrazí se stav objednávky.

  5. Zkuste různá ID objednávek. Pokud použijete celé číslo, které není platnou objednávkou, zobrazí se zpráva o nenalezení objednávky.

    Snímek obrazovky zobrazující zprávu Order not found (Objednávka nebyla nalezena).

    Pokud používáte ID neintegerových objednávek, zobrazí se stránka, která nebyla nalezena. Důležitější je, že aplikace nemá neošetřenou výjimku.

  6. Pokud chcete aplikaci zastavit, vyberte Shift + F5.

Aktualizace stránky objednávek

V tuto chvíli má stránka Moje objednávky odkazy na zobrazení dalších podrobností, ale adresa URL je špatná.

  1. V Průzkumníku souborů rozbalte stránky. Pak vyberte MyOrders.razor.

  2. <a href="myorders/" class="btn btn-success"> Nahraďte prvek tímto kódem:

    <a href="myorders/@item.Order.OrderId" class="btn btn-success">
    

Můžete otestovat, jak tento kód funguje, a to tak, že pro toto cvičení uděláte poslední objednávku pizzy. Pak vyberte Moje objednávky a postupujte podle odkazu Sledování > .