Как я могу получить доступ к браузерам localStorage в Blazor?

asp.net-core blazor c#

Вопрос

Я хочу поддерживать JWT, поэтому мне нужно сохранить токен; есть ли какое-то средство для доступа к этому? Или нам нужно просто зарегистрировать собственную функцию javascript для доступа к этой функции?

Изменить: за совет я попытался использовать JS interop как:

<script>
    localStorage.setItem("key1", "key1data");
    Blazor.registerFunction("readStorage", (key) => {
        return localStorage.getItem(key);
    });
</script>
@if (jwtKey == null)
{
<div class="login-panel">
    <p>JWT not loaded</p>
</div>
}
else
{
<div class="login-panel">
    <p>@jwtKey</p>
</div>
}

@functions {
    public RenderFragment Body { get; set; }
    string jwtKey;

    protected override async Task OnInitAsync()
    {
        jwtKey = RegisteredFunction.Invoke<string>("readStorage", "key1");
        if (jwtKey == null)
        {
            jwtKey = "Unknown";
        }
    }
}

Но это приводит к ошибке WASM в diag:

WASM: [Microsoft.AspNetCore.Blazor.Browser.Interop.JavaScriptException] Не удалось найти зарегистрированную функцию с именем «readStorage». WASM: Ошибка: не удалось найти зарегистрированную функцию с именем «readStorage».

FYI, это находится в MainLayout.cshtml проекта шаблона Blazor VS.

(может сделать новый Вопрос, если это необходимо, в некоторой степени связанный с этим, хотя)

Принятый ответ

Для 0.1 вам нужно написать свой собственный javascript interop. Но я считаю, что это то, над чем работала, и, возможно, в выпуске 0.2.

В качестве альтернативы (если вам не нужна память между сеансами), вы можете написать свой собственный синглтон DI, как это делается здесь: https://github.com/aspnet/samples/blob/master/samples/aspnetcore/blazor/FlightFinder/FlightFinder. Клиент / Услуги / AppState.cs

редактировать
Для этого есть открытый PR, поэтому он должен скоро появиться: https://github.com/aspnet/Blazor/pull/205

Edit2 0.2 сделано, но пока нет localstorage. Тем временем я разработал пакет для этого: BlazorExtensions также на nuget


Популярные ответы

Он может быть реализован по умолчанию в Blazor, но пока я использую: Nuget - BlazorStorage



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow