【问题标题】:Why are CascadingValue's null when accessing the page directly?为什么直接访问页面时CascadingValue的为null?
【发布时间】:2020-03-17 21:18:21
【问题描述】:

我有一个应用程序,其中几乎每个页面都需要引用他们的组织记录,所以在 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 访问页面而不是单击链接访问该页面有什么不同?如果 MainLayout 在页面加载前设置了 CascadingValue,为什么 CascadingParameter 为空?

【问题讨论】:

  • 如果您从 await GetOrganization() 中删除等待,它会起作用;我可能是它在收到回复之前已经运行到设置应用程序,所以此时它将为空问题是如果你保护应用程序免受此为空,在异步任务后第二次被调用退了吗?
  • await base.OnInitializedAsync();之前调用CurrentOrganization = await GetOrganization();是否有效?
  • @aguafrommars,不幸的是,这似乎没有任何作用。
  • @DavidMasterson,CurrentOrganization 在 MainLayout 方法中永远不会为空,它总是被正确设置。我按照您的建议做了,并在 OnParametersAsync 中进行了空检查,现在看起来它确实被调用了两次,第二次设置了 CurrentOrganization。我不知道为什么它正在做它正在做的事情,但它似乎是这样工作的。如果您想将其发布为答案,我可以接受。
  • AspNetCore repo上打开一个问题

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


【解决方案1】:

当您通过 URL 直接进入组织页面时,似乎发生了什么

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

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

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

或者它可能就像调用一样简单

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

正如“来自火星的阿瓜”所建议的那样

【讨论】:

  • 在我的情况下,由注入组件填充的级联值永远不会被填充,尽管值即将到来
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 2020-04-19
  • 2019-11-19
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
相关资源
最近更新 更多