Blazor. NavLink не работает в блоке foreach при многократном нажатии - PullRequest
0 голосов
/ 23 октября 2019

Я создал список NavLink, это только одна разница между ними, динамический параметр Id

<div>
    @foreach (var service in pageGlobal.Person.Services)
    {
        var link = $"service_description/{service.Identifier}";
        <ul class="nav flex-column">
           <li class="nav-item px-3">
              <NavLink class="nav-link" href="@link">
                   @service.Name
               </NavLink>
           </li>
        </ul>
    }
</div>

И это работает только при первом нажатии (независимо от того, какой элемент NavLink работаетправильно).

enter image description here

Нажмите на следующую ссылку - URL-адрес изменен, но ничего не происходит.

enter image description here

Код ServiceDescription.razor

@page "/service_description/{Id:int}"
@using Site.Data
@using Site.ViewModels
@inject StartUpService page

@if (service != null)
{
    <div> <h3>Service Name - @service.Name</h3> - <h4>@service.Description</h4>  </div>
}

@code
{
    [Parameter]
    public int Id { get; set; }

    PageGlobal pageGlobal;
    Service service;

    protected override async Task OnInitializedAsync()
    {
        pageGlobal = await page.GetPageGlobalAsync();
        service = pageGlobal.Person.Services.Where(e => e.Identifier == Id).FirstOrDefault();
    }
}

Как заставить клиента перезагрузить ServiceDescription.razor с помощью нового параметра, используяNavLink функциональность?

1 Ответ

1 голос
/ 23 октября 2019

Эта проблема вызвана OnInitializedAsync. Для OnInitializedAsync он будет вызываться только тогда, когда компонент вызывается, когда компонент готов к запуску.

Если вы хотите изменить service на основе параметра, вы должны использовать OnParametersSetAsync, как показано ниже:

protected override async Task OnParametersSetAsync()
{
    pageGlobal = new PageGlobal
    {
        Person = new Person()
        {
            Services = new List<Service>(){
                new Service{ Identifier = 1, Name = "Test1", Description = "D1" },
                new Service{ Identifier = 2, Name = "Test2" , Description = "D2" },
                new Service{ Identifier = 3, Name = "Test3", Description = "D3"  }
            }
        }
    };
    service = pageGlobal.Person.Services.Where(e => e.Identifier == Id).FirstOrDefault();

}

Вы можете проверить ComponentBase

...