Countries & Cities - #1 - Code

Client > Shared > Navmenu.razor

<div class="top-row ps-3 navbar navbar-dark">
    <div class="container-fluid">
        <a class="navbar-brand" href="">Blazor Countries & Cities</a>
        <button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
            <span class="navbar-toggler-icon"></span>
        </button>
    </div>
</div>

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <nav class="flex-column">
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                <span class="oi oi-home" aria-hidden="true"></span> Countries & Cities
            </NavLink>
        </div>
        <div class="nav-item px-3">
            <NavLink class="nav-link" href="countrylist">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Countries List
            </NavLink>
        </div>
    </nav>
</div>

@code {
    private bool collapseNavMenu = true;

    private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;

    private void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }
}

Client > Pages > Index.razor

@page "/"
@inject ICountryService CountryService;

<PageTitle>Countries & Cities List</PageTitle>

<h3>Countries and Cities</h3>
<div class="DropDownWrapper">
    <SfDropDownList TItem="Country"
                    TValue="string"
                    DataSource="@countries"
                    Placeholder="Select a country"
                    PopupHeight="200px"
                    PopupWidth="250px">
        <DropDownListFieldSettings Text="CountryName" Value="CountryId"></DropDownListFieldSettings>
    </SfDropDownList>
</div>

<div>
        <SfGrid ID="CityGrid"
                DataSource="@cities"
                AllowSorting="true"
                AllowResizing="true"
                Height="200">

            <GridColumns>
                <GridColumn Field="@nameof(City.CityName)"
                            HeaderText="City Name"
                            TextAlign="@TextAlign.Left"
                            Width="50">
                </GridColumn>
                <GridColumn Field="@nameof(City.CityPopulation)"
                            HeaderText="Population"
                            Format="n"
                            TextAlign="@TextAlign.Right"
                            Width="50">
                </GridColumn>
            </GridColumns>
        </SfGrid>
</div>

<style>
    .DropDownWrapper {
        width: 250px;
    }
 </style>

@code {
    List<Country>? countries;
    List<Country>? countriesUnordered;
    List<City>? cities;

    protected override async Task OnInitializedAsync()
    {
        //Populate the list of countries objects from the Countries table.
        await CountryService.GetCountries();
        countriesUnordered = new();
        foreach (var country in CountryService.Countries)
            countriesUnordered.Add(country);

        countries = countriesUnordered.OrderBy(c => c.CountryName).ToList();
    }
}