为什么直接访问页面时CascadingValue为null?

Why are CascadingValue's null when accessing the page directly?

我有一个应用程序,几乎每个页面都需要引用他们的组织记录,所以在 MainLayout.razor 我有这个代码

@code {

  Organization CurrentOrganization { get; set; }

  protected override async Task OnInitializedAsync()
  {
    await base.OnInitializedAsync();
    CurrentOrganization = await GetOrganization();
  }

}

<CascadingValue Name="CurrentOrganization" Value="@CurrentOrganization">
  // This wraps the entire page body
</CascadingValue>

然后在我的页面中,我像这样引用 CascadingValue

@page "/organization"
@code {

  [CascadingParameter(Name = "CurrentOrganization")]
  Organization CurrentOrganization { get; set; }

  protected override async Task OnParametersSetAsync()
  {
      await base.OnParametersSetAsync();
      // Use CurrentOrganization
  }

}

如果我启动网站,将调用 MainLayout 中的 OnInitializedAsync 方法(两次,并且两次都正确设置了 CurrentOrganization),如果我单击“组织”页面,OnParametersSetAsync 方法将触发并且 CurrentOrganization 不为空,一切工作正常。

如果我在浏览器中直接转到组织页面 URL,MainLayout 中的 OnInitializedAsync 会触发一次,然后 OnParametersSetAsync 方法会触发,但 CurrentOrganization 现在为空。

直接通过 URL 访问页面与单击 link 访问页面有何不同?如果 MainLayout 在加载页面之前设置了 CascadingValue,为什么 CascadingParameter 为空?

当您通过 URL 直接进入组织页面时,似乎正在发生的事情是

  1. 您启动 await GetOrganization();
  2. 应用程序继续设置组织页面并触发 OnParametersSet
    使用仍然为空的 CurrentOrganization
  3. 任务完成并设置 CurrentOrganization 参数
  4. 这次使用 CurrentOrganization 集再次引发 OnParametersSet

当您在应用程序中手动执行时,我猜 await GetOrganization() 在您有时间单击 link 之前完成。

如果您在第一次输入 OnParametersSet 时处理了空值,那么当它不为空时在第二次通过时使用它。

它可能就像调用

一样简单
 CurrentOrganization = await GetOrganization(); 
 base.OnInitializedAsync();  

'agua from mars' 建议