Страница Blazor удаляется сразу после рендеринга

При реализации IDisposable на странице блазора (это может быть @page "/" без какого-либо содержимого) и установке точки останова в Dispose() метод вызывается сразу после запуска приложения. Это ошибка? Как я могу предотвратить это?

Обычная страница этого не делает, поэтому вы [непреднамеренно] запрограммировали ее для этого. Если вы не предоставите какой-либо минимальный воспроизводимый пример на этот вопрос нет ответа. Говорим ли мы здесь о предварительном рендеринге и удалении предварительно обработанной страницы?

MrC aka Shaun Curtis 03.09.2024 21:24

Создайте совершенно новый проект Vanilla Blazor (последняя версия). Перейдите в Home.razor, реализуйте IDisposable и установите точку останова в Dispose(). Вызовите отладку. В моем случае я последовательно попадал в точку останова.

Roland Buergi 03.09.2024 21:54

Вероятно, удаляется экземпляр предварительного рендеринга. Вы сказали Create a brand new vanilla Blazor project (latest version). Какой шаблон вы используете? Какая версия .Net? Какие варианты шаблона? НЭИ. Недостаточно информации.

LoneSpawn 03.09.2024 22:08

Шаблон «Веб-приложение Blazor», настройки с параметрами «Сервер», «Включить страницы по умолчанию» и «https». Dotnet 8. Согласно документации, для сервера не должно быть предварительного рендеринга.

Roland Buergi 03.09.2024 23:21

Добавили репозиторий сюда: github.com/rbuergi/blazor-debug

Roland Buergi 03.09.2024 23:40

Также сообщили об ошибке в blazor: github.com/dotnet/aspnetcore/issues/57681

Roland Buergi 04.09.2024 00:46

@RolandBuergi Когда вы выбираете «сервер» в выбранном вами шаблоне InteractiveServer, который по умолчанию включает предварительный рендеринг.

Kevin Krumwiede 04.09.2024 02:05

См. Learn.microsoft.com/en-us/aspnet/core/blazor/comComponents/…

Kevin Krumwiede 04.09.2024 02:09
Для развертывания Сайтов с использованием Blazor, Angular и React с репозиторием на GitHub на Cloudflare
Для развертывания Сайтов с использованием Blazor, Angular и React с репозиторием на GitHub на Cloudflare
Как развернуть сайты с помощью Blazor, Angular и React с репозиторием на GitHub на Cloudflare.
0
8
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я воспроизвел вашу проблему, которая обычно возникает при предварительном рендеринге. В процессе предварительного рендеринга Blazor создает экземпляры компонентов и выполняет первоначальный рендеринг. Если компонент реализует IDisposable, платформа требует удаления ресурсов при удалении компонента из пользовательского интерфейса.

Итак, вы можете установить для приложения режим рендеринга Interactive Server с отключенным предварительным рендерингом:

<head>
        <HeadOutlet @rendermode = "new InteractiveServerRenderMode(prerender: false)" />
    </head>
    
    <body>
        <Routes @rendermode = "new InteractiveServerRenderMode(prerender: false)" />
    </body>

Это не вызовет предварительный рендеринг при запуске:

Ответ принят как подходящий

Это задуманное поведение, а не ошибка. У вас просто еще нет знаний, чтобы понять, что происходит и последствия вариантов, выбранных вами в шаблоне решения.

Вам необходимо прочитать документацию здесь:

Согласно документации, для сервера не должно быть предварительного рендеринга.

На какую часть документов вы имеете в виду?

Вы настроили свой проект с параметром «Интерактивность» на «По странице/компоненту», что означает, что каждая страница изначально предварительно обрабатывается на сервере.

Если для параметра «Интерактивность» установлено значение «Глобальный», предварительно отображается только первая страница.

Изменить App.Razor

    <HeadOutlet />
</head>

<body>
    <Routes />
    <script src = "_framework/blazor.web.js"></script>
</body>

На это:

    <HeadOutlet @rendermode = "@InteractiveServer" />
</head>

<body>
    <Routes @rendermode = "@InteractiveServer" />
    <script src = "_framework/blazor.web.js"></script>

Или выключите его полностью:

    <HeadOutlet @rendermode = "new InteractiveServerRenderMode(prerender: false)" />
</head>

<body>
    <Routes @rendermode = "new InteractiveServerRenderMode(prerender: false)" />
    <script src = "_framework/blazor.web.js"></script>

Большое спасибо за ваши ответы. Моя точная проблема такого характера: мне нужно получить данные с других серверов для рендеринга, и пока я это делаю, я показываю счетчик. Затем представление удаляется, и мой сбор данных отменяется. Как правильно это сделать? отключить пререндер?

Roland Buergi 04.09.2024 11:07

См. stackoverflow.com/questions/77653261/blazor-net-8-splash-scr‌​een, где описан один подход, который я использовал.

MrC aka Shaun Curtis 04.09.2024 20:03

Другие вопросы по теме