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

时间:2019-11-21 20:43:39

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

我有一个应用程序,几乎每个页面都需要引用其组织记录,因此在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不为null,并且一切正常

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

直接通过URL访问页面而不是单击链接来访问页面有什么不同?如果MainLayout在加载页面之前设置了CascadingValue,为什么CascadingParameter为null?

1 个答案:

答案 0 :(得分:0)

似乎正在发生的事情是,当您直接通过URL转到“组织”页面时

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

当您在应用程序内手动进行操作时,我猜await GetOrganization()在您没有时间单击链接之前就已完成。

如果您是第一次处理null,则在您输入OnParameterSet时会在第二遍使用它,如果它不为null。

OR ,它可能和调用一样简单

 CurrentOrganization = await GetOrganization(); 
 base.OnInitializedAsync();  

建议使用“来自火星的阿瓜”