我正试图从BLazor应用程序中的window.sessionStorage中检索一个值。我已经能够成功地设置值。当我去检索它时,它就停止了。。。没有任何错误。。。它只是点击函数并停止。
我把我的代码设置在";"代码隐藏";结构,所以我的.rarzor页面继承自BASE类。在这个基类中,我存储了所有的逻辑。
这是RAZOR页面。。。
@page "/PhotoViewer"
@inherits PhotoViewerBase
<h3>Photo Viewer</h3>
<p>ActiveMediaCode: @ActiveMediaCode</p>
<button class="btn btn-primary" @onclick="@btn_OnClick">Push it</button>
这是PhotoViewerBase,它继承自。。。
namespace IF.APP.BlabaBoothBlazor.Pages
{
public class PhotoViewerBase : Models.PageBase
{
protected String ActiveMediaCode { get; set; }
protected override Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
}
return base.OnAfterRenderAsync(firstRender);
}
protected void btn_OnClick()
{
ActiveMediaCode = GetMediaCodeAsync().Result;
}
}
}
namespace IF.APP.BlabaBoothBlazor.Models
{
public class PageBase : ComponentBase
{
[Inject]
protected IJSRuntime JS { get; set; }
[Inject]
protected NavigationManager Navigator { get; set; }
public async Task<String> GetMediaCodeAsync()
{
// STOPS PROCESSING HERE
return await JS.InvokeAsync<String>("sessionStorage.getItem", "ActiveMediaCode");
}
public async Task SetMediaCodeAsync(String mediaCode)
{
await JS.InvokeVoidAsync("sessionStorage.setItem", "ActiveMediaCode", mediaCode);
}
}
}
SetMediaCodeAsync((方法可以正常工作。但是,当我点击剃刀页面上的按钮时,我会进入GetMediaCodeAsync((方法,在上面评论的地方,调试器就会停止。它不会退出调试模式。。。什么都没有。我的输出窗口开始报告线程正常关闭,但没有错误或异常。
我在浏览器中加载页面后进行调用,以确保sessionStorage可用。
只是在寻找一个新的视角,也许还有一些想法。。。
ActiveMediaCode = GetMediaCodeAsync().Result;
是一种非常错误的异步方式。它可能会陷入僵局。
更换
protected void btn_OnClick()
{
ActiveMediaCode = GetMediaCodeAsync().Result;
}
带有
protected async Task btn_OnClick()
{
ActiveMediaCode = await GetMediaCodeAsync();
}
不要更改剃刀标记,这很好。