Жизненный цикл страницы содержимого Blazor Server выполняется раньше, чем макет

На стороне сервера Blazor у меня есть эта строка кода, которая извлекает сериализованную службу из localstorage (или sessionstorage) браузера с помощью взаимодействия JavaScript:

viewData.Cart = await jsInterop.GetJson<Cart>("Cart", BrowserStorageMode.SessionStorage);

Я помещаю десериализованную службу в свойство в службе с настраиваемой областью действия (с именем ViewData), чтобы в других местах я вводил ViewData и использовал сохраненную службу.

Как всем известно, эта строка кода, поскольку она использует взаимодействие с JavaScript, не может быть в OnInitialized() методе жизненного цикла макета, потому что на данном этапе она не работает. поэтому я поместил его в OnAfterRender() в блоке if (firstRender == true).

Проблема в том, что если я хочу получить службу на странице содержимого, поскольку жизненный цикл страницы выполняется раньше, чем страница макета (я проверял это с помощью точек останова), служба на странице содержимого еще недоступна в обоих OnInitialized и OnAfterRender(firstRender).

Этот тест, который я сделал, полезен, когда сайт впервые загружается или пользователь обновляет страницу, потому что я хочу, чтобы корзина пользователя не потерялась. Итак, как решить эту проблему.


person mz1378    schedule 23.06.2021    source источник
comment
Этот комментарий не отвечает на ваш вопрос. Но поскольку я столкнулся с той же проблемой, я делюсь этой информацией. Я не использую BrowserStorageMode.SessionStorage для хранения каких-либо пользовательских данных, кроме статических словарей на стороне сервера. Я идентифицирую пользователя по руководству из файла cookie сеанса. Я объяснил этот дизайн на stackoverflow.com/questions/67938642/. Преимущество в том, что guid напрямую известен коду на стороне сервера, не дожидаясь готовности jsInterop.   -  person    schedule 23.06.2021
comment
одно решение: в вашем файле _Host.cshtml измените render-mode = ServerPrerendered на render-mode = Static Solution   -  person Ali Borjian    schedule 24.06.2021