我刚刚启动了一个新的blazor项目(WASM,而不是Server)来学习它是如何工作的,所以如果我看起来在做一些愚蠢的事情,请原谅我的无知。
使用。net 5该页面应该调用本地托管的API(我已经检查了工作),然后显示它在我加载的页面上获得的信息。阅读文档和Blazor组件生命周期显示,使用OnInitializedAsync()
可能是我最好的选择,因为我想做调用,但没有阻塞网页,看到我在这里使用ParameterAttribute
,我需要等到参数被绑定(至少在我的理解中)。
我得到的是调用完成后,它应该导致页面重新渲染,在页面上显示我的对象信息。
这是我的GameDetails.razor
文件:
@page "/gamedetails/{gameId:int}"
@inject HttpClient HttpClient
@inject NavigationManager NavManager
<h1>Game Details</h1>
@if (_game != null)
{
<p>
Id: @_game.Id<br />
Title: @_game.Title<br />
Year: @_game.Year<br />
Developer: @_game.Developer<br />
Publisher: @_game.Publisher<br />
Region: @_game.Region<br />
Region Code: @_game.ShortRegion <br />
Keymaps: @_game.KeyMaps
</p>
}
@code {
[ParameterAttribute]
public int gameId { get; set; }
private GameSearchResult _game;
protected override async Task OnInitializedAsync()
{
string url = $"Mappings?gameId={gameId}";
_game = await HttpClient.GetFromJsonAsync<GameSearchResult>(url, new JsonSerializerOptions()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
}
}
应该发生的事情是,你点击另一个页面上的卡片,然后导航到这个页面,然后从API请求信息显示在页面上。
实际发生的是页面加载,但没有显示我的任何信息。我已经调试并看到信息被成功检索并存储在称为_game
的GameSearchResult
对象中,因此我的猜测是页面没有像我认为的那样重新渲染。
我已经尝试调用StateHasChanged()
,因为有些人建议在其他地方尝试强制重新渲染,但仍然没有。
我应该怎么做才能得到想要的行为?我也可以接受整个调用是同步的,这并不困扰我。
首先,OnInitializedAsync在应用程序生命周期内每个页面组件只运行一次,因此不是响应参数更改的好地方。
见:https://blazor-university.com/components/component-lifecycles/
第二,试着把[ParameterAttribute]改成[Parameter]
[Parameter]
public int gameId { get; set; }
protected override async Task OnParametersSetAsync()
{
string url = $"Mappings?gameId={gameId}";
_game = await HttpClient.GetFromJsonAsync<GameSearchResult>(url, new JsonSerializerOptions()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
}