Как заставить элемент html показывать значение после вызова grp c (или другого asyn c метода) с помощью Blazor? - PullRequest
0 голосов
/ 10 января 2020

Я тестирую с Blazor и GRP c, и я пытаюсь следовать этому уроку (https://www.youtube.com/watch?v=ynZlJ3pACpI), который, кажется, устарел. В любом случае, с некоторыми адаптациями это должно работать, даже если там не так много примеров или учебных пособий. Проблема в том, что значение элемента html не обновляется с помощью ответа grp c.

Я предпочитаю иметь это:

@page "/greeter"
@inject GrpcService1.GreeterService GreeterService1

@using BlazorApp1.Data

<h1>Grpc Connection</h1>

<input type="text" @bind="@Name" />
<button onclick="@SayHello">Button</button>

<p>@Greetmsg</p>

@code {
    string Name;
    private string Greetmsg;

    async void SayHello()
    {
        this.Greetmsg = await this.GreeterService1.SayHello(this.Name);
    }

}

Но что-то могло иметь был обновлен, потому что я не могу вызвать метод SayHello таким образом. Я должен поставить @ перед Onclick, в противном случае я получаю ошибку «Невозможно преобразовать группу методов в тип делегата». Поэтому я сформулировал это так:

<button @onclick="SayHello">Button</button>

Таким образом, это работает, но результат, который я получаю от сервера grp c, отображается только при нажатии кнопки для следующего запроса. Я выполнил код executuin и запрос сделан, ответ приходит, но значение на странице не обновляется. Затем выполнение кода заканчивается и все еще не обновляется. Когда я нажимаю кнопку для нового запроса, значение как-то обновляется.

Я также добавляю еще одну кнопку

<button @onclick="SayHello">SayHello</button>
<button @onclick="updateGreetmsg">updateGreetmsg</button>

с пустой функцией под другой

    public void updateGreetmsg()
    {

    }

И достаточно вызвать эту функцию, чтобы было показано ранее полученное значение. Таким образом, функция await не работает в первой функции, где t должен.

Кто-нибудь знает, как решить эту проблему?

1 Ответ

1 голос
/ 10 января 2020

Это должно быть async Task SayHello() Не используйте void ... используйте Task вместо.

Избегайте асинхронных c void методов

Ваш элемент кнопки должен определяется следующим образом:

<button @onclick="@SayHello">SayHello</button>

Примечание. Атрибут onclick не является атрибутом onclick обычного элемента Html. Ему должен предшествовать знак «@», и он называется директивой компилятора.

Компоненты Razor также широко используют атрибуты директив (@onclick, @bind, @ref и т. Д.) Для элементов для управления различными аспектами компиляции компонентов (обработка событий, привязка данных, ссылки на компоненты и элементы и т. д.).

Подробнее ...

Обратите внимание, что после события пользовательского интерфейса, такого как выше, ваш Компонент автоматически перерисовывается. В прошлом нам приходилось вызывать метод StateHasChanged, чтобы уведомить компонент о том, что его состояние изменилось и что он может отображаться. В настоящее время, если вы хотите sh повторно выполнить рендеринг вашего компонента из-за изменения состояния компонента, вызванного событиями, не относящимися к пользовательскому интерфейсу, вам следует вызвать метод StateHasChanged

...