OnAfterRenderAsync и OnAfterRender вызываются после завершения рендеринга компонента.
OnInitializedAsync и OnInitialized вызываются, когда компонент инициализируется после получения его начальных параметров от родительского компонента в SetParametersAsync.
При переносе кода в метод OnInitializedAsync
пользовательские данные будут загружены до того, как элемент управления будет отрисован.
Изменить: (вы хотите передавать состояние между компонентами)
Документация Microsoft по управлению состоянием
Еще один пример сохранения состояния в памяти и передачи его компонентам через внедрение зависимостей.
Чтобы использовать «Государственное управление», вы должны зарегистрировать «Сервис», который можно использовать для государственного управления.
Например; Создайте класс с именем AppState
со значениями, состояние которых вы хотите сохранить.
public class AppState
{
public AppState()
{
//this class is to help maintain application state.
}
public UserData UserData { get; set; }
public string SomeOtherStateValue { get; set; }
}
затем зарегистрируйте этот класс в своем Services
как Singleton
(см. Срок службы):
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
//...other services
//...
// add AppState as singleton
builder.Services.AddSingleton<AppState>();
//...
//...more stuff
await builder.Build().RunAsync();
}
Затем в вашем Index.razor
файле (или там, где вам нужно вызвать его в первый раз) используйте внедрение зависимостей, чтобы получить доступ к AppState
, а в OnInitialzedAsync()
вызовите данные пользователя с помощью HttpContent
.
@page "/"
@using System.Text.Json
@using System.Text
@inject AppState appState
@inject HttpClient httpClient
<h1>..all your html or components on the page...</h1>
@code{
protected override async Task OnInitializedAsync()
{
var userRequestData = new UserDataRequest(options);
var request = new StringContent(JsonSerializer.Serialize(userRequestData), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync($"api/users/", request);
if (response.IsSuccessStatusCode)
{
appState.UserData = await JsonSerializer.DeserializeAsync<UserData>(await response.Content.ReadAsStreamAsync(), new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
}
await base.OnInitializedAsync();
}
}
Это будет ждать вызова API, пока не получит ответ. Если ответ был успешным, например: response.IsSuccessStatusCode
верно. извлеките данные из ответного сообщения и сохраните их в appState.UserDate
.
В любом последующем компоненте вы можете получить AppState
путем инъекции, используя @inject AppState appState
или если он находится в файле кода [Inject] AppState appState;
В последующих компонентах вы можете добавить проверку в OnInitializedAsync
методе:
.
.
if (appState?.UserData == null)
{
//appData.UserData = await request user data...
}
// more code..
.
.
!! Но это не то, как следует обрабатывать аутентификацию !!
Если вам нужна аутентификация, посмотрите ASP.NET Проверка подлинности и авторизация Core Blazor, поскольку в нем используется AuthenticationStateProvider.
Что касается проверки того, был ли уже сделан вызов http-клиенту, await
должен дождаться ответа от httpClient
, прежде чем продолжить.
Если appState.UserData
имеет какое-то значение, значит вызов был успешным.
person
CobyC
schedule
28.09.2020