我想支持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";
}
}
}
但是这导致了diag中的WASM错误:
WASM: [Microsoft.AspNetCore.Blazor.Browser.Interop.JavaScriptException] 找不到名为'readStorage'的注册函数。 WASM: 错误:找不到名为'readStorage'的注册函数。
仅供参考,这是在Blazor VS样板项目的MainLayout.cshtml中。
(如果合适,可以提出一个新的问题;虽然有点与此相关)
答案 0 :(得分:7)
对于0.1,您需要编写自己的javascript互操作。但我相信这是有效的,也许是在0.2版本中。
或者(如果您不需要在会话之间存储),您可以编写自己的DI单身,如此处所示:https://github.com/aspnet/samples/blob/master/samples/aspnetcore/blazor/FlightFinder/FlightFinder.Client/Services/AppState.cs
修改强>
有一个公开的PR,所以确实应该很快就会出现:https://github.com/aspnet/Blazor/pull/205
<强> EDIT2 强> 已完成0.2,但尚未进行本地存储。在此期间,我已经为此开发了一个软件包:BlazorExtensions也在nuget上
答案 1 :(得分:2)
默认情况下可能会在Blazor中实现,但现在我使用: Nuget - BlazorStorage
答案 2 :(得分:2)
以防其他人为此而苦恼(截至2018年7月): 史蒂夫·桑德森(Steve Sanderson)在其NDC会议视频中谈到了这个问题(本地存储): https://www.youtube.com/watch?v=JU-6pAxqAa4 从大约45分钟左右开始。
他为此使用了一个nuget包: https://github.com/cloudcrate/BlazorStorage 该页面上的用法示例,因此无需在此处重新说明。
答案 3 :(得分:0)
现在有一个名为 Blazor.Extensions.Storage 的软件包,这是一个经过精心设计的扩展 https://github.com/BlazorExtensions/Storage
答案 4 :(得分:0)
Microsoft有自己的软件包Microsoft.AspNetCore.ProtectedBrowserStorage
,但到目前为止,它尚未投入生产,并且仅用于服务器端。
如果您不想拥有第三方依赖性,则可以通过JS interop
轻松实现。
public class LocalStorage
{
private readonly IJSRuntime _jsRuntime;
public LocalStorage(IJSRuntime jsRuntime)
{
_jsRuntime = jsRuntime;
}
public async Task SetAsync<T>(string key, T value)
{
string jsVal = null;
if (value != null)
jsVal = JsonSerializer.Serialize(value);
await _jsRuntime.InvokeVoidAsync("localStorage.setItem",
new object[] { key, jsVal });
}
public async Task<T> GetAsync<T>(string key)
{
string val = await _jsRuntime.InvokeAsync<string>("localStorage.getItem", key);
if (val == null) return default;
T result = JsonSerializer.Deserialize<T>(val);
return result;
}
public async Task RemoveAsync(string key)
{
await _jsRuntime.InvokeVoidAsync("localStorage.removeItem", key);
}
public async Task ClearAsync()
{
await _jsRuntime.InvokeVoidAsync("localStorage.clear");
}
}
用法:
await _localStorage.SetAsync("Test", 42);
var val = await _localStorage.GetAsync<int>("Test");
await _localStorage.RemoveAsync("Test");
await _localStorage.ClearAsync();