Сторона сервера Blazor: refre sh gui после вызова API - PullRequest
0 голосов
/ 26 мая 2020

Я пишу приложение Blazor на стороне сервера. Вы можете создавать датчики с состояниями (Хорошо, Предупреждение, Ошибка ...) с небольшим API для сообщения о новых состояниях.

Теперь я хочу восстановить новое состояние (или все датчики) на клиенте Blazor из базы данных, если вызывается API.

Я пытался применить «3. Контейнер состояний» из этого руководства: https://chrissainty.com/3-ways-to-communicate-between-components-in-blazor/

Как я могу заставить сайт повторно загружать датчики после запроса API? Sensor и Blazor Client - это разные устройства.


@inject ISensorData _db


<h1>Dashboard</h1>

@if (sensors is null)
{
    <p>Laden...</p>
}
else
{
    if (sensors.Count == 0)
    {
        <p>Keine Sensoren vorhanden!</p>
    }
    else
    {
        foreach (SensorModel sensor in sensors)
        {
            <button class="btn btn-lg @StatusColor(sensor.Status) m-2">@sensor.Name @sensor.Message</button>
        }
    }
}

@code {

    private List<SensorModel> sensors;

    protected override async Task OnInitializedAsync()
    {
        sensors = await _db.GetSensors();
    }

    private string StatusColor(int status)
    {
        switch (status)
        {
            case 0:
                return "btn-secondary";
            case 1:
                return "btn-success";
            case 2:
                return "btn-warning";
            case 3:
                return "btn-danger";
            default:
                return "btn-secondary";
        }
    }
}

Мой API

        [HttpGet("updateState")]
        public async Task<IActionResult> UpdateState(int id, int status, string? message)
        {
            if (id <= 0)
            {
                return BadRequest();
            }

            if (string.IsNullOrEmpty(message))
            {
                message = "";
            }
            try
            {
                await _db.UpdateState(id, status, message);
                //Task.Run(async () => { _dbState.CallRequestRefresh(); });
                _dbState.CallRequestRefresh();

            }
            catch(Exception ex)
            {
                throw ex;
            }

            return NoContent();
        } enter code here

Мой API-контроллер

        {
            _db = db;
            NavigationManager = navigationManager;
            hubConnection = new HubConnectionBuilder()
                .WithUrl("https://localhost:44346/dbRefreshHub")
                .Build();

            hubConnection.StartAsync();
        }

1 Ответ

0 голосов
/ 26 мая 2020

Я не совсем понимаю ваш вопрос, так как он нечетко сформулирован, и, возможно, мне что-то не хватает ...

Однако предложенный вами шаблон State Container никоим образом не может вам помочь. Он предназначен для управления состоянием ваших компонентов и т. Д. c. Но я считаю, что вы ищете способ уведомить свое клиентское приложение о том, что «API вызывается» и что оно (клиентское приложение) должно обновлять новое состояние ... Я прав?

Если да, то я считаю, что вы можете реализовать клиент SignalR (Microsoft.AspNetCore.SignalR.Client) для этого.

А go, я видел в одном из превью Blazor Дэниела Ротс, фрагмент кода, демонстрирующий, как использовать клиент SignalR в Blazor. Найдите его или, возможно, найдите topi c в документации и посмотрите, может ли он предложить вам какие-то средства правовой защиты.

Надеюсь, это сработает ...

...