Estou tentando definir um componente que atua como um wrapper de alerta de bootstrap.
Alerta de Bootstrap.razor
<div class="alert alert-@AlertType d-@(string.IsNullOrEmpty(Message) ? "none" : "block")" role="alert">
@Message
</div>
@code {
[ParameterAttribute]
private string AlertType { get; set; } = "info"; // Default alert type
[ParameterAttribute]
private string? Message { get; set; }
// Method to update the alert type and message
public async Task ShowAsync(string alertType, string message)
{
AlertType = alertType;
Message = message;
await InvokeAsync(StateHasChanged);
}
// Method to hide the alert
public async Task HideAsync()
{
Message = null;
await InvokeAsync(StateHasChanged);
}
protected override async Task OnParametersSetAsync()
{
//Message is ALWAYS null here
await base.OnParametersSetAsync();
}
}
Página:
<form class="row" @onsubmit="SubmitForm" @onsubmit:preventDefault>
<Alert @ref=SaveAlert></Alert>
<button type="submit">Save</button>
</form>
@code {
private Alert? SaveAlert;
private async Task SubmitForm()
{
try
{
await SetIsLoading(true); //DISPLAYS A LOADING SPINNER
if (SaveAlert != null) await SaveAlert.HideAsync();
//.......
if (SaveAlert != null) await SaveAlert.ShowAsync("success", "OK");
}
catch (Exception ex)
{
if (SaveAlert != null) await SaveAlert.ShowAsync("danger", ex.Message);
}
finally
{
await SetIsLoading(false);
}
StateHasChanged();
}
}
O componente de alerta nunca é atualizado, em "OnParametersSetAsync" o parâmetro "Message" é sempre nulo.
Eu tentei versões não assíncronas dos métodos, colocando "StateHasChanged" em todos os lugares, não chamando o método "Hide", também removendo os atributos [ParameterAttribute] para que fossem usados como variáveis regulares, mas nada parece funcionar para mim
Sou bem novo no blazor, então não sei o que mais poderia ser relevante. Estou usando o aplicativo como RenderMode="Server"
O que estou fazendo errado?
Primeiro: certifique-se de ter o modo de renderização definido globalmente:
Aplicativo.navalha
No momento, seu código não compila corretamente, então não tenho certeza de como você está depurando o código apresentado. Você está declarando os Parâmetros como privados quando eles deveriam ser públicos.
Em um nível mais geral, você complicou demais o código porque é novo no Blazor e ainda está adquirindo o conhecimento necessário.
Aqui está uma maneira mais sucinta de construir um alerta usando binding. Capturar instâncias com
@ref
está OK, mas esse acoplamento tão apertado entre componentes é melhor evitado, se possível.Um objeto de dados para manter o estado de alerta.
Alerta.navalha
Demonstração: