ASP .NET Core 3.1 - Usando o Identity de cabo a rabo - XXI


Hoje vamos continuar a série de artigos mostrando como usar o ASP .NET Core Identiy na versão 3.1 da ASP .NET .Core e do EF Core.

Continuando a vigésima parte do artigo veremos como deletar usuários cadastrados.

Deletando usuários cadastrados

Para implementar a exclusão de usuários vamos iniciar alterando o código do botão Deletar na view ListUsers que esta sendo exibida na figura abaixo:

Com fazer a exclusão de dados usando o método Http GET não é recomendado, vamos fazer isso criando um método DeleteUser que vai receber os dados via POST.

Então vamos ter que definir um formulário usando o método POST que vai postar os dados para a Action DeleteUser do controlador AdministrationController passando o Id do usuário :

 <form method="post" asp-action="DeleteUser" asp-route-id="@user.Id">
        <button type="submit" class="btn btn-danger">Deletar</button>
</form>

Note que o tipo do botão agora é 'submit'.

Abaixo temos o código alterado na view ListUsers.cshtml :

...
  <div class="card-footer">
                <a asp-action="EditUser" asp-controller="Administration"
                   asp-route-id="@user.Id" class="btn btn-primary">Editar</a>

                <form method="post" asp-action="DeleteUser" asp-route-id="@user.Id">
                  <button type="submit" class="btn btn-danger">Deletar</button>
                </form>
  </div>
...

Podemos agora criar o método Action DeleteUser no controlador AdministrationController  que vai usar o método DeleteAsync() do serviço UserManager para excluir o usuário selecionado pelo seu id:

         public async Task<IActionResult> DeleteUser(string id)
         {
            var user = await userManager.FindByIdAsync(id);
            if (user == null)
            {
                ViewBag.ErrorMessage = $"Usuário com Id = {id} não foi encontrado";
                return View("NotFound");
            }
            else
            {
                var result = await userManager.DeleteAsync(user);
                if (result.Succeeded)
                {
                    return RedirectToAction("ListUsers");
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError("", error.Description);
                }
                return View("ListUsers");
            }
        }

Já temos tudo pronto para excluir um usuário selecionado mas precisamos ter certeza de que o usuário realmente quer realizar esta operação, e, para isso, vamos exibir para o usuário uma solicitação de confirmação da exclusão quando o botão Deletar for clicado.

Vamos usar a mesma lógica que foi usada para excluir uma role e aproveitar a mesma função JavaScript confirmaDelete() que criamos no arquivo CustomScript.js na pasta wwwroot/js.

Assim o código da view ListUsers.cshtml relacionado com os botões Editar e Deletar deve ser alterado conforme abaixo:

@model IEnumerable<ApplicationUser>
@{
    ViewBag.Title = "Todos os usuários";
}
<h2>Usuários</h2>
@if (Model.Any())
{
    <a asp-action="Register" asp-controller="Account"
       class="btn btn-primary mb-3" style="width:auto">
        Novo Usuário
    </a>
    foreach (var user in Model)
    {
             ...
            <div class="card-footer">
                <div class="card-footer">
                    <form method="post" asp-action="DeleteUser" asp-route-id="@user.Id">
                        <a asp-controller="Administration" asp-action="Edituser"
                           asp-route-id="@user.Id" class="btn btn-primary">Editar</a>
                        <span id="confirmaDeleteSpan_@user.Id" style="display:none">
                            <span>Deseja realmente deletar este usuário ?</span>
                            <button type="submit" class="btn btn-danger">Sim</button>
                            <a href="#" class="btn btn-primary"
                               onclick="confirmaDelete('@user.Id', false)">Não</a>
                        </span>
                        <span id="deleteSpan_@user.Id">
                            <a href="#" class="btn btn-danger"
                               onclick="confirmaDelete('@user.Id', true)">Deletar</a>
                        </span>
                    </form>
                </div>
            </div>
        </div>
    }
}
...       

Agora temos que incluir nesta View, no fim do arquivo ListUsers, a seção para acessar o script Javascript:


@section Scripts {
     <script src="~/js/CustomScript.js"></script>

 

Executando o projeto e selecionando um usuário para exclusão temos o resultado a seguir:

No próximo artigo vamos entender como funciona a exclusão em cascata e como impor a integridade referencial de restrição de chave estrangeira ON DELETE NO ACTION no EF Core.

Pegue o projeto aqui: IdentityTotal_GerenciaUsers.zip (sem as referências)

"No princípio era o Verbo, e o Verbo estava com Deus, e o Verbo era Deus.
Ele estava no princípio com Deus.
Todas as coisas foram feitas por ele, e sem ele nada do que foi feito se fez."
João 1:1-3

Referências:


José Carlos Macoratti