#c# #blazor
#c# #blazor
Вопрос:
Я действительно новичок в программировании, поэтому прошу прощения, если использую неправильную терминологию. Я пытаюсь использовать API Riot в приложении Blazor, но переменные, которые я отображаю на странице, не обновляются до значений, которые они имеют после нажатия кнопки, которая использует API для установки значений. Это может быть из-за того, как я создаю экземпляр объекта.
Я пытаюсь получить призывателя.Имя и вызывающий.Уровень для отображения имени и уровня, но вместо этого они остаются пустыми на странице, даже после нажатия кнопки. Я добавил наблюдение к обоим элементам и подтвердил, что они возвращают значения в коде, но не знаю, почему они не обновляются на странице. Это из-за строки Summoner summoner = new Summoner(); ? Я попытался установить для него значение null, но это приводит к ошибке.
Вот код:
@using Newtonsoft.Json
@page "/"
@inject HttpClient http;
<h1>API Calling</h1>
<button class="btn btn-success" @onclick="@GetSummonerTask">Get Summoner</button>
<br>
<p>
NAME: @summoner.Name
<br>
LEVEL: @summoner.Level
</p>
@code{
Summoner summoner = new Summoner();
private async Task GetSummonerTask()
{
SummonerInformation summonerInformation = new SummonerInformation();
Summoner summoner = await summonerInformation.GetSummoner();
}
public class SummonerInformation
{
HttpClient client = new HttpClient();
public async Task<Summoner> GetSummoner()
{
var summonerName = await client.GetAsync(new Uri("https://na1.api.riotgames.com/lol/summoner/v4/summoners/by-name/weeatrocks?api_key={I have my API key here but taking out for obvious reasons}"));
var JSON = await summonerName.Content.ReadAsStringAsync();
Summoner summoner = JsonConvert.DeserializeObject<Summoner>(JSON);
return summoner;
}
}
public class Summoner
{
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "summonerLevel")]
public string Level { get; set; }
}
}
Комментарии:
1. Любые сообщения об ошибках javascript или иным образом
2. Нет сообщений об ошибках в консоли
Ответ №1:
Вы присваиваете возврат локальной переменной с тем же именем, что и поле класса.
private async Task GetSummonerTask()
{
SummonerInformation summonerInformation = new SummonerInformation();
summoner = await summonerInformation.GetSummoner();
// await InvokeAsync(StateHasChanged);
}
Комментарии:
1. Спасибо за ответ! Я добавил это, но внизу есть зеленая загогулина с надписью «CS4014: поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрите возможность применения оператора ‘await’ к результату вызова «. Похоже, это не работает, поможет ли добавление await где-нибудь?
2. Вы установили точку останова, чтобы проверить содержимое переменной sumoner?. ожидание клиента. GetFromJsonAsync<Вызывающий> (…) был бы лучшим способом десериализации, но неясно, что возвращает ваш API.
3. У меня есть! В нем говорится, что значения следующие: вызывающий: {ApiTest . Страницы. Index.Summoner} summoner.Name : Призыватель «WeEatRocks». Уровень: «65»
4. Вызывающий вызывающий = ожидает информации о вызывающем. GetSummoner(); проблема в том, что у вас есть локальная переменная. Это не обновление поля класса. Я обновлю решение
5. Да! Вот и все!! Я достал Summoner и сделал так, как вы написали, и это работает!! Большое вам спасибо! Необходим ли await InvokeAsync? Я это прокомментировал, и оно все еще работает.