Вы находитесь на странице: 1из 6

11/09/2020 Blazor - Toast Notifications (sem usar javascript)

  Blazor -  Toast Notifications (sem usar javascript)

Hoje veremos como exibir notificações toast no Blazor sem usar JavaScript. Vamos usar somente
código C#, HTML e CSS.

Este artigo foi totalmente baseado no original de Chris Sainty com pequenas alterações e ajustes.

Uma notificação toast fornece um feedback simples sobre uma operação em uma pequena janela pop-up, e, ocupa a
quantidade de espaço necessária para a mensagem; a atividade atual continua visível e interativa desaparecendo
automaticamente após um tempo limite.  É um recurso muito usando em aplicações Androids.

Atualmente existem diversas bibliotecas que usam JavaScript para emitir toast notifications que podemos usar com o
Blazor.( veja aqui e aqui )

Hoje veremos como implementar este recurso em um projeto Blazor Server sem usar JavaScript mas apenas código
C#, e umas pitadas de CSS e HTML.

O objetivo do projeto é dar uma idéia de como implementar este recurso sem usar JavaScript.

Recursos usados:

Visual Studio 2019 Community (16.4.x)


.NET Core 3.1 SDK
Blazor

Criando o projeto Blazor Server no VS Community 2019


Abra o VS 2019 Community (versão mínima 16.4) e selecione a opção Create a New Project;

A seguir selecione a opção Blazor app e clique em next;

Informe o nome do projeto :  Blazor_ToastNotification1, a localização e clique em Create;

A seguir teremos uma janela com duas opções :

1. Blazor Server App


2. Blazor WebAssembly App

Selecione a primeira opção - Blazor Server App. Não vamos usar autenticação e vamos habilitar o https.

www.macoratti.net/20/04/blz_toastsjs1.htm 1/6
11/09/2020 Blazor - Toast Notifications (sem usar javascript)

Clique no botão Create para criar o projeto.

Antes de prosseguir vamos limpar o projeto excluindo os arquivos abaixo e suas referências:

Counter.razor
WeatherForecast.razor
WeatherForecast.cs
WeatherForecastService.cs

Vamos também ajustar o arquivo NavMenu.razor deixando apenas a opção Toast Notifications e a opção Demo Toast
conforme o código a seguir:

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">


<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Toast Notifications
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="demo">
<span class="oi oi-plus" aria-hidden="true"></span> Demo Toast
</NavLink>
</li>
</ul>
</div>

Agora com o projeto criado e os ajustes feitos vamos criar o serviço de notificação Toast.

Criando o serviço de Notificação toast


Crie uma pasta Services na raiz do projeto (Project->New Folder) e nesta pasta crie o arquivo ToastLevel onde vamos
definir uma enumeração com os tipos de mensagens toast a serem exibidas.

public enum ToastLevel


{
Info,
Success,
Warning,
Error
}

Crie também o arquivo ToastService onde vamos definir o serviço para emitir notificações:

using System;
using System.Timers;

namespace Blazor_ToastNotification1.Services
{
public class ToastService : IDisposable

www.macoratti.net/20/04/blz_toastsjs1.htm 2/6
11/09/2020 Blazor - Toast Notifications (sem usar javascript)
{
public event Action<string, ToastLevel> OnShow;
public event Action OnHide;
private Timer Countdown;

public void ShowToast(string message, ToastLevel level)


{
OnShow?.Invoke(message, level);
StartCountdown();
}

private void StartCountdown()


{
SetCountdown();

if (Countdown.Enabled)
{
Countdown.Stop();
Countdown.Start();
}
else
{
Countdown.Start();
}
}

private void SetCountdown()


{
if (Countdown == null)
{
Countdown = new Timer(5000);
Countdown.Elapsed += HideToast;
Countdown.AutoReset = false;
}
}

private void HideToast(object source, ElapsedEventArgs args)


{
OnHide?.Invoke();
}

public void Dispose()


{
Countdown?.Dispose();
}
}
}

A classe ToastService vai permitir emitir as notificações toast e possui um único método público, ShowToast() que recebe
a mensagem a ser exibida o e nível da mensagem toast.

O serviço também possui dois eventos, OnShow e OnHide, e um temporizador, Countdown. Nosso componente toast se
inscreverá nos eventos e os usará para exibir  e ocultar as notificações.

O timer é usado internamente pelo serviço e esta definido inicialmente com um delay de 5 segundos, após esse período
o evento OnHide será invocado.

Criando o componente Toast.razor e o code-behind ToastBase.cs


Agora vamos criar o componente Toast e aqui vamos separar a lógica do componente do código de marcação usando a
experiência code-behind.

Para isso vamos criar um componente Toast.razor na pasta Shared com o código abaixo:

@inherits ToastBase

<div class="toast @(IsVisible ? "toast-visible" : null) @BackgroundCssClass">


<div class="toast-icon">
<i class="fa fa-@IconCssClass" aria-hidden="true"></i>
</div>
<div class="toast-body">
<h5>@Heading</h5>
<p>@Message</p>
</div>
</div>

Note que usamos a declaração @inherits ToastBase no início do arquivo para indicar que ele herda da classe ToastBase
que iremos criar a seguir.

www.macoratti.net/20/04/blz_toastsjs1.htm 3/6
11/09/2020 Blazor - Toast Notifications (sem usar javascript)

Por definição o arquivo code-behind tem que ter nome do componente Toast seguido do prefixo Base e tem que herdar
de ComponentBase.

O código da classe ToastBase é dado abaixo:

using Blazor_ToastNotification1.Services;
using Microsoft.AspNetCore.Components;
using System;

namespace Blazor_ToastNotification1.Shared
{
public class ToastBase : ComponentBase, IDisposable
{
[Inject] ToastService ToastService { get; set; }

protected string Heading { get; set; }


protected string Message { get; set; }
protected bool IsVisible { get; set; }
protected string BackgroundCssClass { get; set; }
protected string IconCssClass { get; set; }

protected override void OnInitialized()


{
ToastService.OnShow += ShowToast;
ToastService.OnHide += HideToast;
}

private void ShowToast(string message, ToastLevel level)


{
BuildToastSettings(level, message);
IsVisible = true;
InvokeAsync(StateHasChanged);
}

private void HideToast()


{
IsVisible = false;
InvokeAsync(StateHasChanged);
}

private void BuildToastSettings(ToastLevel level, string message)


{
switch (level)
{
case ToastLevel.Info:
BackgroundCssClass = "bg-info";
IconCssClass = "info";
Heading = "Info";
break;
case ToastLevel.Success:
BackgroundCssClass = "bg-success";
IconCssClass = "check";
Heading = "Success";
break;
case ToastLevel.Warning:
BackgroundCssClass = "bg-warning";
IconCssClass = "exclamation";
Heading = "Warning";
break;
case ToastLevel.Error:
BackgroundCssClass = "bg-danger";
IconCssClass = "times";
Heading = "Error";
break;
}

Message = message;
}

public void Dispose()


{
ToastService.OnShow -= ShowToast;
}
}
}

Vamos entender o código:

Estamos injetando o serviço ToastService no componente e definindo algumas propriedades que serão usadas na parte
de marcação do componente.

A seguir, estamos substituindo um dos eventos do ciclo de vida do componente Blazor, OnInitialized onde estamos

www.macoratti.net/20/04/blz_toastsjs1.htm 4/6
11/09/2020 Blazor - Toast Notifications (sem usar javascript)

conectando os eventos que definimos no ToastService aos manipuladores no componente.

Depois, temos os manipuladores de eventos ShowToast e HideToast. ShowToast pega a mensagem e o nível de toast e
os passa para o método BuildToastSettings onde definmos vários nomes de classes CSS, o cabeçalho e a mensagem.

A propriedade IsVisible é definida no componente e StateHasChanged é chamado usando o InvokeAsync. O método


HideToast apenas define IsVisible como false e chama StateHasChanged.

Precisamos chamar StateHasChanged pois o componente precisa renderizar novamente quando seu estado for alterado.
Quando essa atualização vem do próprio componente ou via um valor passado para o componente usando a diretiva
[Parameter], ou seja, algo que o componente conhece e pode monitorar , então  uma nova renderização é acionada
automaticamente.

No entanto, se ocorrer uma atualização no estado dos componentes de uma fonte externa, por exemplo, um evento,
esse processo automático é ignorado e uma chamada manual deve ser feita para que o componente saiba que algo
mudou. É aqui que entra o StateHasChanged.

www.macoratti.net/20/04/blz_toastsjs1.htm 5/6
11/09/2020 Blazor - Toast Notifications (sem usar javascript)

www.macoratti.net/20/04/blz_toastsjs1.htm 6/6

Вам также может понравиться