Допустим, у меня есть следующий код в MainLayout.razor
<CascadingValue Value = "@(async () => await someclass.GetValueAsnyc())" Name = "asyncValue">
<article class = "content px-4">
@Body
</article>
</CascadingValue>
И в Index.razor:
<h1>Hello!</h1>
@code{
[CascadingParameter(Name = "asyncValue")] public string AsyncValue{ get; set; }
protected override async Task OnInitializedAsync()
{
//do something with AsyncValue- it is always null
}
}
Я предполагаю, что объявление переменной в Index.razor не ожидает каскадного значения в Mainlayout.razor. Это работает, если я вызываю метод синхронно с .Result в конце, но это не то, что я хотел бы сделать, если это возможно.
Есть ли у кого-нибудь руководство или может указать мне правильное направление, чтобы каскадное значение загружалось асинхронно?





Я думаю, это должно помочь.
Сначала потребительский компонент. Каскадное значение — это Task, которое может завершиться или не завершиться. Чтобы потреблять его, вы await его. Если это уже завершено, то ждать нечего. Он дает результат сразу.
<h3>@this.value</h3>
<button class = "btn btn-primary" @onclick=this.OnClick>Get Value Again</button>
@code {
private string value = string.Empty;
[CascadingParameter] private Task<string>? DataTask { get; set; }
protected override async Task OnInitializedAsync()
{
if (this.DataTask is not null)
this.value = await DataTask;
}
private async Task OnClick()
{
if (this.DataTask is not null)
this.value = await DataTask;
}
}
И тестовая страница. Я не помещал его в макет или приложение, так как проще увидеть, что происходит на тестовой странице. Каскадное значение — это поле Task<string>, которому вы назначаете метод.
@page "/Test"
<PageTitle>Test</PageTitle>
<CascadingValue Value = "this.DataTask">
<MyComponent />
</CascadingValue>
@code {
private Task<string>? DataTask;
protected override Task OnInitializedAsync()
{
DataTask = GetSomeDateAsync();
return Task.CompletedTask;
}
private async Task<string> GetSomeDateAsync()
{
await Task.Delay(5000);
return DateTime.Now.ToLongTimeString();
}
}
В основном так работает каскад AuthenticationState.
Очень интересно! Я очень ценю, что вы поделились этим, я попробую позже и отчитаюсь!
Не обращайте внимания на мой предыдущий комментарий, это, кажется, сделало это, спасибо!
Если вы используете асинхронность, я боюсь, что фактический тип свойства может оказаться как
Task<string>, а неstring. Может, попробовать сопоставить этот тип и посмотреть? С другой стороны, вы можете «вычислить» значение в блоке @code в MainLayout, а затем просто передать свойство, содержащее значение