如果我使用OnInitializedAsync方法,则在页面初始化时发生NullReferenceException

时间:2019-11-25 19:17:04

标签: asp.net-core blazor asp.net-core-3.0

我有一个简单的应用程序,但由于错误而停止了页面初始化工作

NullReferenceException:对象引用未设置为对象的实例。 Site.Shared.MainLayout.BuildRenderTree(RenderTreeBuilder __builder) 错误: enter image description here

但是代码没有什么复杂的。 App.razor:

<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>

_Host.cshtml: enter image description here

MainLayout.razor: enter image description here

StartUpService.cs: enter image description here

page.GetPageGlobalAsync()运行良好,我可以在调试模式下传递此方法。 enter image description here

但是在出现此错误之后。而且不知道是什么原因,如何获得有关错误的更多信息。

UPD

如果我将代码更改为:

PageGlobal page =  new PageGlobal()

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

2 个答案:

答案 0 :(得分:1)

您的页面正在尝试渲染@pageGlobal.Title,甚至还没有通过async方法获得它。这就是为什么如果您进行pageGlobal = new PageGlobal();不会崩溃的原因。

将其更改为此:

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

感谢@Quango提供了一支班轮:

<div class="top-row h3">
    @pageGlobal?.Title
</div>

如果这不能解决问题,请告诉我,我将尽我所能:)

答案 1 :(得分:1)

在进行Task.Run编程时,不建议使用Async。尝试在Task.FromResult中使用GetPageGlobalAsync而不是Task.Run

 public async Task<PageGlobal> GetPageGlobalAsync()
    {
        return await Task.FromResult( new PageGlobal());
    }