none
Delete User no esta implementado RRS feed

  • Debate general

  • Muy Buenas, que os parece este metodo para eliminar usuarios mientras Microsoft implementa en la nueva version del UserManager

    AccountController

     [Authorize(Roles = "admin")]
            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> DeleteUser(AspNetUsers johndoe)
            {
                var user = UserManager.FindByName(johndoe.UserName);
                if (user != null)
                    johndoe.Id = user.Id;
                else
                {
                    ViewBag.clase = "alert-danger";
                    ViewBag.msg = "usuario invalido";
                    return View(johndoe);
                }
                    //dele from logins table
                    var logins = await  UserManager.GetLoginsAsync(user.Id);
                    foreach (var log in logins)
                        await UserManager.RemoveLoginAsync(user.Id, log);
    
                    //delete from roles
                    var Roles = await UserManager.GetRolesAsync(user.Id);
                    foreach (var rol in Roles)
                        await UserManager.RemoveFromRolesAsync(user.Id, rol);
    
                    var Claims = await UserManager.GetClaimsAsync(user.Id);
                    foreach (var cla in Claims)
                        await UserManager.RemoveClaimAsync(user.Id, cla);
    
                    using (SecundaryUserContext db = new  SecundaryUserContext())
                    {
                        try
                        {
                            AspNetUsers u = await db.SecundaryUsersContext.FindAsync(johndoe.Id);
                            db.SecundaryUsersContext.Remove(u);
                            await db.SaveChangesAsync();
                            ViewBag.clase = "alert-success";
                            ViewBag.msg = "El usuario ha sido eliminado correctamente";
                        }
                        catch(Exception e)
                        {
                            ViewBag.clase = "alert-danger";
                            ViewBag.msg = e.Message;
                            return View(johndoe);
                        }
                    }
                return View();
            }

    NOTA: Cualquier critica constructiva o destructiva es bienvenida

    Saludos


    G. Poliovei

    La vista

    @model Salgest5.DAL.AspNetUsers
    
    @{
        ViewBag.Title = "Eliminar Usuario";
    }
    
    <h2>@ViewBag.Title.</h2>
    <div class="row">
        <div class="col-md-8">
          
                @using (Html.BeginForm("DeleteUser", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                    @Html.AntiForgeryToken()
                    <h4>Eliminar usuario</h4>
                    <hr />
                    @Html.ValidationSummary(true)
                    <div class="form-group">
                        @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
                        <div class="col-md-10">
                            @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
                            @Html.ValidationMessageFor(m => m.UserName)
                        </div>
                    </div>
                    <div class="@ViewBag.clase">
                        @ViewBag.msg
                    </div>
                    <div class="form-group">
                        <div class="col-md-offset-2 col-md-10">
                            <input type="submit" value="Eliminar" class="btn btn-default" />
                        </div>
                    </div>
    
                }
      
        </div>
    
    </div>
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }

    Se amplio agregando la vista


    lunes, 17 de noviembre de 2014 17:46

Todas las respuestas

  • hola

    llamar a una variable johndoe no creo que sea correcto

    public async Task<ActionResult> DeleteUser(AspNetUsers johndoe)

    ----

    la primer parte que valida si existe el usuario

    if (user == null){ ViewBag.clase = "alert-danger"; ViewBag.msg = "usuario invalido"; return View(johndoe); }

    johndoe.Id = user.Id;

    //resto codigo

    ------

    sera correcto eliminar el usuario en base al nombre ? imagino no es el fullname sino el nombre de login el cual esta definido en la tabla como UNIQUE, no ?

    -----

    la eliminacion de logins, roles, claims, etc asociado al usuario porque no se realiza por medio de un DELETE en cascada, asi se evitaria mucho codigo

    -----

    veo que todas las operaciones las realizas desde el UserManager, porque la ultima que implicaria eliminar al usuario en concreto no lo realizas aplicando la misma tecnica

    porque veo que el usuario lo eliminas accediando al contexto, la clase UserManager no tiene un metodo para eliminar el usuarios?

    estas seguro que puedes eliminar un usuario de forma fisica? no deberias hacerlo de forma logica, que pasa si el usuaario se realaciona con entidades de negocio o auditoria

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 17 de noviembre de 2014 17:58
  • Gracias por su crítica, y si bien la firma esta implementada en la prerealese de UserManager su método aún no está escrito, dicen que en la próxima actualización estará pronto, pero mientras tanto aquellos que tenemos la necesidad de eliminar de forma física el usuario debemos apañarnos de alguna manera. Podría usar un string como variable que viene de la vista con el nombre, este es el primer intento y funciona, pero siempre algo se nos escapa o hacemos mal y por eso la búsqueda de opiniones

    G. Poliovei

    lunes, 17 de noviembre de 2014 18:11
  • pero estoy viendo la clase

    UserManager<TUser> Class

    y este tiene el metodo

    DeleteAsync

    que elimina el usuario, o sea no veo que se necesite acceder al contexto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 17 de noviembre de 2014 19:55
  • si, pero el cuerpo que sobreescribe al metodo es un

    Throw new NotImplementedExepcion();

    por eso la necesidad temporal de esa solución

    le hice los cambios que sugirio y quedo mas prolijo

    [Authorize(Roles = "admin")]
            [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> DeleteUser(string UserName)
            {
                var user = UserManager.FindByName(UserName);
                
                if (user == null)
                {
                    ViewBag.clase = "alert alert-danger";
                    ViewBag.msg = "usuario invalido";
                    return View();
                }
                   
                    //dele from loguins table
                    var logins = await  UserManager.GetLoginsAsync(user.Id);
                    foreach (var log in logins)
                        await UserManager.RemoveLoginAsync(user.Id, log);
    
                    //delete from roles
                    var Roles = await UserManager.GetRolesAsync(user.Id);
                    foreach (var rol in Roles)
                        await UserManager.RemoveFromRolesAsync(user.Id, rol);
    
                    var Claims = await UserManager.GetClaimsAsync(user.Id);
                    foreach (var cla in Claims)
                        await UserManager.RemoveClaimAsync(user.Id, cla);
    
                    //deleting user
    
                    using (SecundaryUserContext db = new  SecundaryUserContext())
                    {
                        try
                        {
                            AspNetUsers u = await db.SecundaryUsersContext.FindAsync(user.Id);
                            db.SecundaryUsersContext.Remove(u);
                            await db.SaveChangesAsync();
                            ViewBag.clase = "alert alert-success";
                            ViewBag.msg = "El usuario ha sido eliminado correctamente";
                        }
                        catch(Exception e)
                        {
                            ViewBag.clase = "alert alert-danger";
                            ViewBag.msg = e.Message;
                            return View();
                        }
                    }
                return View();
            }

    vista

    @{
        ViewBag.Title = "Eliminar Usuario";
    }
    
    <h2>@ViewBag.Title.</h2>
    <div class="row">
        <div class="col-md-8">
                  @using (Html.BeginForm("DeleteUser", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                    @Html.AntiForgeryToken()
                    <h4>Eliminar usuario</h4>
                    <hr />
                     <div class="form-group">
                        <div class="col-md-10">
                            @Html.TextBox("UserName","", new { @class = "form-control" })
                           
                        </div>
                    </div>
        <div class="@ViewBag.clase" role="alert">
            @ViewBag.msg
        </div>
                    <div class="form-group">
                        <div class="col-md-offset-2 col-md-10">
                            <input type="submit" value="Eliminar" class="btn btn-default" />
                        </div>
                    </div>
                }
        </div>
    </div>


    G. Poliovei

    lunes, 17 de noviembre de 2014 20:48