Описание проблемы
При переходе на страницу Blazor, содержащую MudTabs с параметром запроса, указывающим индекс активной вкладки (например, ?tab=1), приложение выдает исключение ArgumentOutOfRangeException во время первого рендеринга компонента цикл.
Подробности об исключении
Код: Выделить всё
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
at System.Collections.Generic.List`1.get_Item(Int32 index)
at MudBlazor.MudTabs.OnAfterRenderAsync(Boolean firstRender)
- Версия MudBlazor: 7.15.0
- Модель хостинга Blazor: Сервер
- .NET Версия: 9.0
Компонент страницы (.razor)
Код: Выделить всё
@page "/example/{Id:long}"
@using MudBlazor
Details content
Tab 2 content
Tab 3 content
Код: Выделить всё
public partial class Example : ComponentBase
{
[Parameter] public long Id { get; set; }
[Parameter, SupplyParameterFromQuery(Name = "tab")]
public int? TabFromQuery { get; set; }
private MudBlazor.MudTabs? _tabs;
private int? _activePanelIndex;
private int? _pendingIndexFromQuery;
private bool _tabsInitialized;
private bool _enableTab2 = false;
private bool _enableTab3 = false;
protected override Task OnParametersSetAsync()
{
// Store query parameter for later use
if (TabFromQuery is int i && i >= 0)
_pendingIndexFromQuery = i;
return Task.CompletedTask;
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
// Try to activate the tab from query parameter
if (_tabs?.Panels.Count > 0 && !_tabsInitialized)
{
_tabsInitialized = true;
if (_pendingIndexFromQuery.HasValue)
{
var count = _tabs.Panels.Count;
var index = Math.Min(_pendingIndexFromQuery.Value, count - 1);
_tabs.ActivatePanel(index);
_activePanelIndex = index;
_pendingIndexFromQuery = null;
}
else
{
_activePanelIndex = 0;
}
}
}
private void OnActivePanelChanged(int index)
{
_activePanelIndex = index;
}
}
- Создайте страницу с MudTabs и динамическими/отключенными панелями
- Перейдите на страницу с параметром запроса: /example/123?tab=1
- Выдается исключение MudTabs.OnAfterRenderAsync()
Исключение возникает во время жизненного цикла компонента MudTabs:
- OnParametersSetAsync: захватывается параметр запроса tab=1
- Первый рендеринг: MudTabs начинает рендеринг, коллекция Panels заполняется.
- OnAfterRenderAsync(firstRender: true): MudTabs внутренне пытается получить доступ к Panels[ActivePanelIndex]
- Проблема: на данный момент коллекция Panels еще не полностью инициализирована или пуста.
- Результат: ArgumentOutOfRangeException при доступе к индексу
- MudTabs должен обрабатывать случаи, когда ActivePanelIndex установлен до полной инициализации панелей
- По умолчанию должен быть установлен индекс 0 или ждать, пока панели будут установлены готово
- При навигации по параметрам запроса не должно возникать никаких исключений.
Все они по-прежнему создают исключение:
Код: Выделить всё
Код: Выделить всё
if (_tabs?.Panels.Count > 0)
{
_tabs.ActivatePanel(requestedIndex);
}
Код: Выделить всё
protected override async Task OnAfterRenderAsync(bool firstRender)
{
StateHasChanged();
await Task.Delay(100);
_tabs?.ActivatePanel(index);
}
Код: Выделить всё
protected override async Task OnInitializedAsync()
{
if (_pendingIndexFromQuery.HasValue)
_tabs?.ActivatePanel(_pendingIndexFromQuery.Value);
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... y-paramete
Мобильная версия