如果我使用 OnInitializedAsync 方法,页面初始化时出现 NullReferenceException

Ser*_*nko 2 asp.net-core blazor asp.net-core-3.0

我有一个简单的应用程序,但它在页面初始化时停止工作并出现错误

NullReferenceException:未将对象引用设置为对象的实例。Site.Shared.MainLayout.BuildRenderTree(RenderTreeBuilder __builder) 错误: 在此处输入图像描述

但代码中并没有什么复杂的地方。应用程序剃须刀:

<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
    </Found>
  <NotFound>
      <LayoutView Layout="@typeof(MainLayout)">
          <p>Sorry, there's nothing at this address.</p>
      </LayoutView>
  </NotFound>
Run Code Online (Sandbox Code Playgroud)

_Host.cshtml: 在此输入图像描述

MainLayout.razor: 在此处输入图像描述

StartUpService.cs: 在此处输入图像描述

page.GetPageGlobalAsync() 运行良好,我可以在调试模式下传递此方法。 在此输入图像描述

但是在我出现这个错误之后。并且不知道原因是什么以及如何获得有关问题所在的更多信息。

UPD

如果我将代码更改为:

PageGlobal page =  new PageGlobal()
Run Code Online (Sandbox Code Playgroud)

它开始工作,但 OnInitializedAsync 是异步方法,为什么我不能在 OnInitializedAsync 方法中使用异步等待方法?

Ger*_*rit 10

@pageGlobal.Title您的页面在从异步方法获取它之前就正在尝试渲染。这就是为什么如果你这样做pageGlobal = new PageGlobal();它就不会崩溃。

改成这样:

<div class="top-row h3">
    @if(pageGlobal != null)
    {
        pageGlobal.Title
    }
</div>
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要单衬:

<div class="top-row h3">
    @pageGlobal?.Title
</div>
Run Code Online (Sandbox Code Playgroud)