Blazor / Переменные не обновляются после задачи @onclick

#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? Я это прокомментировал, и оно все еще работает.