Использование JSRuntime.InvokeAsync вызывает ошибку «Индекс вышел за пределы диапазона» на карусели BlazorStrap

#c# #blazor #blazor-server-side #blazor-jsinterop

Вопрос:

В моем серверном приложении Blazor у меня есть страница с каруселью BlazorStrap и кнопкой для загрузки zip-файла. Карусель работает нормально и может без проблем просматривать все изображения, пока я не нажму кнопку, чтобы загрузить zip-файл. Zip-файл загружается правильно, но после этого я получаю эту ошибку в консоли:

Ошибка: Система.Исключение ArgumentOutOfRangeException: Индекс вышел за пределы диапазона. Должно быть неотрицательным и меньше размера коллекции. (Параметр «индекс») в системе.Коллекции.Generic.List`1.get_Item(индекс Int32) в BlazorStrap.BSCarouselBase.AnimationEnd(отправитель BSCarouselItemBase)
в Microsoft.AspNetCore.Компоненты.Компонентная база.CallStateHasChangedOnAsyncCompletion(Задача задачи) в Microsoft.AspNetCore.Компоненты.RenderTree.Renderer.GetErrorHandledTask(Задача taskToHandle)

Html для моей карусели и кнопка загрузки файлов:

 <BlazorStrap.BSCarousel NumberOfItems="@slideshowImages.Count" style="width: 23vw;">
    <div class="carousel-inner">
        @foreach (var item in slideshowImages)
        {
            <BlazorStrap.BSCarouselItem Src="@item.Source" Alt="@item.Alt" style="width: 100%;">
                @if (bShowImageTitle == true)
                {
                    <BlazorStrap.BSCarouselCaption CaptionText="@item.Caption.Split('.')[0]" />
                }
            </BlazorStrap.BSCarouselItem>
        }
    </div>
    <BlazorStrap.BSCarouselControl CarouselDirection="BlazorStrap.CarouselDirection.Previous" NumberOfItems="@slideshowImages.Count" />
    <BlazorStrap.BSCarouselControl CarouselDirection="BlazorStrap.CarouselDirection.Next" NumberOfItems="@slideshowImages.Count" />
</BlazorStrap.BSCarousel>

<button class="btn btn-primary bold" type="button" @onclick="(e => btnDownloadAllClick())">DOWNLOAD FILES</button>
 

Код для получения предметов карусели:

 List<Slideshow> slideshowImages = new List<Slideshow>();

public class Slideshow
{
    public string Source { get; set; }
    public string Alt { get; set; }
    public string Caption { get; set; }
    public string Header { get; set; }
}

public int iImageCount;

protected override void OnInitialized()
{
    //here i'm getting the images from a folder in azure storage, this works fine
    List<string> tempList = clsBlobService.ListBlobs(folderPath);

    foreach (var img in tempList)
        {
            Slideshow tempItem = new Slideshow
            {
                Source = rootPath   img,
                Alt = img.Split('/').Last(),
                Caption = img.Split('/').Last()
            };

            slideshowImages.Add(tempItem);
        }

        iImageCount = slideshowImages.Count;
}
 

Код для нажатия кнопки «Загрузить файлы»:

 public async void btnDownloadAllClick()
{   
    await JSRuntime.InvokeVoidAsync("open", "/Temp/MyZipFile.zip");
}
 

Редактировать: Я забыл добавить, что мой режим визуализации является серверным, а не серверным.

Комментарии:

1. Сможете ли вы опубликовать воспроизводимый набор кода здесь или на Github? Возможно, потребуется провести некоторые эксперименты, чтобы найти решение.

Ответ №1:

Ваша ошибка случается at BlazorStrap.BSCarouselBase.AnimationEnd() .

Но на GitHub я не могу найти базу данных bscarousel, и запись предполагает, что ваша ошибка была исправлена.

Итак, обновите свой пакет(ы).

Комментарии:

1. Ошибка больше не возникает в AnimationEnd (), но теперь возникает в BlazorStrap.BSCarousel. Таймер сброса()

2. @SarahCox: Тогда обновите вопрос. Укажите, какие версии (Blazor и BlazorStrap) включают весь соответствующий (асинхронный) код.

Ответ №2:

попробуйте это

  
    @if (bShowImageTitle == true 
                amp;amp; item.Caption.Split('.')!=null  
                   amp;amp; item.Caption.Split('.').Length > 0  
        )
     {
      <BlazorStrap.BSCarouselCaption CaptionText="@item.Caption.Split('.')[0]" />
      }