MudTabs выдает ArgumentOutOfRangeException при загрузке страницы с параметром запросаC#

Место общения программистов C#
Ответить
Anonymous
 MudTabs выдает ArgumentOutOfRangeException при загрузке страницы с параметром запроса

Сообщение Anonymous »

Я хочу установить индекс активной панели на основе значения параметра запроса
Описание проблемы
При переходе на страницу 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


Код (.razor.cs)

Код: Выделить всё

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 или ждать, пока панели будут установлены готово
  • При навигации по параметрам запроса не должно возникать никаких исключений.
Попытки обходных путей
Все они по-прежнему создают исключение:
❌ Попытка 1: прямая привязка ActivePanelIndex Результат: то же исключение при первом рендеринге
❌ Попытка 2: использование ActivatePanel в OnAfterRenderAsync

Код: Выделить всё

if (_tabs?.Panels.Count > 0)
{
_tabs.ActivatePanel(requestedIndex);
}
Результат: Исключение по-прежнему возникает до выполнения нашего кода
❌ Попытка 3: Задержка с помощью StateHasChanged

Код: Выделить всё

protected override async Task OnAfterRenderAsync(bool firstRender)
{
StateHasChanged();
await Task.Delay(100);
_tabs?.ActivatePanel(index);
}
Результат: Исключение возникает до задержки
❌ Попытка 4: Настройка в OnInitializedAsync

Код: Выделить всё

protected override async Task OnInitializedAsync()
{
if (_pendingIndexFromQuery.HasValue)
_tabs?.ActivatePanel(_pendingIndexFromQuery.Value);
}
Результат: _tabs имеет значение null, панели еще не существуют


Подробнее здесь: https://stackoverflow.com/questions/798 ... y-paramete
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»