При реализации IDisposable на странице блазора (это может быть @page "/" без какого-либо содержимого) и установке точки останова в Dispose() метод вызывается сразу после запуска приложения. Это ошибка? Как я могу предотвратить это?
Создайте совершенно новый проект Vanilla Blazor (последняя версия). Перейдите в Home.razor, реализуйте IDisposable и установите точку останова в Dispose(). Вызовите отладку. В моем случае я последовательно попадал в точку останова.
Вероятно, удаляется экземпляр предварительного рендеринга. Вы сказали Create a brand new vanilla Blazor project (latest version).
Какой шаблон вы используете? Какая версия .Net? Какие варианты шаблона? НЭИ. Недостаточно информации.
Шаблон «Веб-приложение Blazor», настройки с параметрами «Сервер», «Включить страницы по умолчанию» и «https». Dotnet 8. Согласно документации, для сервера не должно быть предварительного рендеринга.
Добавили репозиторий сюда: github.com/rbuergi/blazor-debug
Также сообщили об ошибке в blazor: github.com/dotnet/aspnetcore/issues/57681
@RolandBuergi Когда вы выбираете «сервер» в выбранном вами шаблоне InteractiveServer
, который по умолчанию включает предварительный рендеринг.
См. Learn.microsoft.com/en-us/aspnet/core/blazor/comComponents/…
Я воспроизвел вашу проблему, которая обычно возникает при предварительном рендеринге. В процессе предварительного рендеринга 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>
Большое спасибо за ваши ответы. Моя точная проблема такого характера: мне нужно получить данные с других серверов для рендеринга, и пока я это делаю, я показываю счетчик. Затем представление удаляется, и мой сбор данных отменяется. Как правильно это сделать? отключить пререндер?
См. stackoverflow.com/questions/77653261/blazor-net-8-splash-screen, где описан один подход, который я использовал.
Обычная страница этого не делает, поэтому вы [непреднамеренно] запрограммировали ее для этого. Если вы не предоставите какой-либо минимальный воспроизводимый пример на этот вопрос нет ответа. Говорим ли мы здесь о предварительном рендеринге и удалении предварительно обработанной страницы?