【发布时间】: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