Partage
  • Partager sur Facebook
  • Partager sur Twitter

Recupérer l'id du PC que je souhaite supprimer

Sujet résolu
    4 mars 2019 à 12:56:43

    Bonjour à tous,

    Je n'ai pas de messages d'erreurs, mais je ne visualise pas la démarche à faire pour récupérer l'id de l'ordinateur à supprimer reliée à cette utilisateur. 

    Un petit visuelle : 

    Sur le profil de l'utilisateur, j'ai une liste d'équipement (de PC) . Et la question que je me pose c'est comment récupérer le bon id pour pouvoir supprimer le bon equipement.

    Dans ma view, la liste est afficher grâce à un foreach : 

     @{int i = 0;
                                        foreach (var eq in Model.listEquipments)
                                        {
                                            i = i + 1;
                                            <div class="contenairPc">
    
                                                <div>
                                                    <p class="countPC"> Pc @i</p>
                                                </div>
    
                                                <div class="row">
                                                    <!-- ASSET-->
                                                    <div class="form-group col-6">
                                                        <div class="col-xs-6">
                                                            <h5>@Html.DisplayNameFor(model => model.equipment.asset)</h5>
                                                            <p>@eq.asset</p>
                                                            @*<input type="text" class="form-control" name="phone" id="phone" placeholder="enter phone" title="enter your phone number if any.">*@
                                                        </div>
                                                    </div>
                                                    <!-- Model DU PC-->
                                                  
    
    //ETC ... eq.model, eq.serial_number, eq.name_netbios , eq.id ..
    }
    }

    J'aimerai lorsque je clique sur "supprimer" récupérer en post  l'élement eq.id dans ma méthode deleteEquipment (situé dans mon controller).  

    Ma view utilise le model : UsersModelView

    namespace ProjetLocalisationSass.Models
    {
        public class UsersModelView
        {
            public users user { get; set; }
            public equipments equipment { get; set; }
            public plateau plateau { get; set; }
            private static DbEntities db = new DbEntities();
    
            public List<users> listUsers { get; set; }
    
            public List<equipments> listEquipments { get; set; }
    
            /* les constructeurs */
            public UsersModelView()
            {
    
            }
            public UsersModelView(users user)
            {
                this.user = user;
                UserPc();
            }
          
            /*
             * récupérer tout les pc que possède l'utilisateur
             * */
            private void UserPc()
            {
                listEquipments = new List<equipments>();
    
                // on récupère l'id de l'utilisateur.
                var recup_user_id = user.id;
    
                //la query : je recherche dans la database tout les pc qui ont pour id recup_user_id
                var query = from elementTampon in db.users_has_equipments
                            join elementEquipement in db.equipments on elementTampon.equipments_id equals elementEquipement.id
                            join elementUser in db.users on elementTampon.users_id equals elementUser.id
                            where elementUser.id.Equals(recup_user_id)
                            select new
                            {
                                id = elementEquipement.id,
                                asset = elementEquipement.asset,
                                marque = elementEquipement.marque,
                                serial_number = elementEquipement.serial_number,
                                model = elementEquipement.model,
                                created_at = elementEquipement.created_at,
                                updated_at = elementEquipement.updated_at,
                                deleted_at = elementEquipement.deleted_at,
                                name_netbios = elementEquipement.name_netbios,
                                position = elementEquipement.position
    
                            };
                //Et j'ajoute la valeur pour chaque attribut 
                foreach (var equip in query)
                {
                    equipments tempEquipement = new equipments();
                    tempEquipement.id = equip.id;
                    tempEquipement.asset = equip.asset;
                    tempEquipement.marque = equip.marque;
                    tempEquipement.serial_number = equip.serial_number;
                    tempEquipement.model = equip.model;
                    tempEquipement.created_at = equip.created_at;
                    tempEquipement.updated_at = equip.updated_at;
                    tempEquipement.deleted_at = equip.deleted_at;
                    tempEquipement.name_netbios = equip.name_netbios;
                    tempEquipement.position = equip.position;
    
                    listEquipments.Add(tempEquipement);
                }
            }
    
           
    
        }
    
    
    
    }

    Dans mon controller :


    Avant de faire db.users_has_equipments.Remove() est supprimer ma liste d'équipment , il me faudrait le bon id que je n'arrive pas à récupérer car je n'arrive pas à savoir comment recupérer eq.id  qui est dans ma view. l'autocompletionme propose rien de bien utile.

    users_has_equipments est la table pivot qui relie la table equipment et la table user grâce au clef user_id et equipment_id . 

    Je vous remercie, pour votre aide.  Si vous avez un exemple, je veux bien, même dans un autre contexte. 

    -
    Edité par Cielphis 4 mars 2019 à 13:25:15

    • Partager sur Facebook
    • Partager sur Twitter
      4 mars 2019 à 13:45:55

      Bonjour,

      Il faut que tu récupères l'id de l'équipement dans ta view et que tu l'envoies en tant que paramètre avec le bouton supprimer à ta méthode "DeleteEquipment" au lieu d'envoyer les informations du user.

      Pour cela, tu devrais te renseigner du côté des formulaires, au clic sur le bouton tu appelles ta méthode en envoyant en paramètre l'id de l'équipement.

      Et ensuite tu fais tes requêtes pour supprimer dans la table pivot, puis dans la table principale.


      o/

      • Partager sur Facebook
      • Partager sur Twitter
      Insanity is doing the exact same fuckin' thing over and over again, expecting shit to change...
        4 mars 2019 à 15:45:12

        Merci beaucoup pour cette information, j'avais complétement oublié ! Je n'ai pas réussi car ce que je récupère est null, et je me demande bien pourquoi .. 

        dans ma view : 

         <button class="btn-sm ButtonChangePC col-3" href="@Url.Action("DeleteEquipment", "Users", new { idEquipment = eq.id, id = ViewBag.Id, userModel= ViewBag.UserModel})" v-on:click=btnChangePCIsActive()> Supprimer </button>
        



        Dans mon controller :

        ///*
                // * delete un equipment
                // * */
                public ActionResult DeleteEquipment(UsersModelView userModel, int idEquipment, int id)
                {
                    equipments equipSearch = new equipments();
        
                    //Chercher dans la base de donné l'equipment correspondant à id equipment
                     equipSearch = EquipmentMethod.equipmentObtain(idEquipment);
        
                    //on utilise la méthode RemoveEquipment pour suprrimer equiSearch de la base de donnée users_has_equipments 
                    userModel.RemoveEquipment(userModel.user, equipSearch);
        
                    db.SaveChanges();
                    return RedirectToAction("DetailsUser");
        
        
                }
        // GET: Users/DetailsUser/{5}
                public ActionResult DetailsUser(int id)
                {
                    //récupére l'id de l'utilisateur connecter
                     id = int.Parse(HttpContext.User.Identity.Name);
        
                    users users = db.users.Find(id);
        
                    //on instancie userModel et on lui donne les propriété de l'utilisateur connecté
                    UsersModelView userModel = new UsersModelView(users);
                  
        
                    if (users == null)
                    {
                        return HttpNotFound();
                    }
        
                    ViewBag.Id = id;
                    ViewBag.userModel = userModel;
        
                    return View(userModel);
                }
        
        
                // POST: Users/DetailsUser/5
                // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
                // plus de détails, voir  https://go.microsoft.com/fwlink/?LinkId=317598.
                [HttpPost]
                [ValidateAntiForgeryToken]
                public ActionResult DetailsUser( UsersModelView userModel, users editUser)
                {
        
                    if (ModelState.IsValid)
                    {
                        try
                        {
                            editUser = userModel.user;
                            db.Entry(editUser).State = EntityState.Modified;
                            db.SaveChanges();
                        }
                        catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
                        {
                            Exception raise = dbEx;
                            foreach (var validationErrors in dbEx.EntityValidationErrors)
                            {
                                foreach (var validationError in validationErrors.ValidationErrors)
                                {
                                    string message = string.Format("{0}:{1}",
                                        validationErrors.Entry.Entity.ToString(),
                                        validationError.ErrorMessage);
                                    // raise a new exception nesting
                                    // the current instance as InnerException
                                    raise = new InvalidOperationException(message, raise);
                                }
                            }
                            throw raise;
                        }
                        
                        return RedirectToAction("DetailsUser");
                    }
                    return View(userModel);
                }


        Dans la méthode POST, je rentre dans la condition !modelStade.isValid , car en effet les différentes variables que je récupère sont null (Et je ne peut pas avoir un first_name null) . Mais je ne comprend pas pourquoi je ne récupère pas ces informations..

        J'ai même fait dans mon bouton:

        new {userModel = userModel= ViewBag.UserModel})
         <button class="btn-sm ButtonChangePC col-3" href="@Url.Action("DeleteEquipment", "Users", new { idEquipment = eq.id, id = ViewBag.Id, userModel= ViewBag.UserModel})" v-on:click=btnChangePCIsActive()> Supprimer </button>
        

        Mais je récupère toujours rien, donc mon objet est null. Et encore une fois, je comprend pas le pourquoi du comment mon objet est null ^^'

        En tout cas merci ! 

        • Partager sur Facebook
        • Partager sur Twitter
          5 mars 2019 à 11:07:52

          Bonjour,

          Quand tu passes en debug sur ta solution, est-ce que l'enchaînement de tes méthodes se fait correctement ?

          Sachant que tu as 2 méthodes du même nom qui est "DetailsUser", il faut penser à renseigner correctement les paramètres pour appeler la bonne.

          Or, dans tes return vers "DetailsUser", tu ne renseignes aucun paramètre dans tous les cas que je vois ...

          Il ne te manque rien ? ;)

          o/

          • Partager sur Facebook
          • Partager sur Twitter
          Insanity is doing the exact same fuckin' thing over and over again, expecting shit to change...
            5 mars 2019 à 12:40:13

            Bonjour, 

            Effectivement, à chaque fois que je veux supprimer un PC, je rentre dans ma méthode post DetailUser qui maintenant doit gérer deux situation (edit, et supprimer).

            Pour celà j'ai mis des name à mes boutons submit et je gère le bon cas selon si l'utilisateur veut éditer ou supprimer. Je ne passe plus directement par l'action du controller DeleteEquipment.

            ma méthode DetailUser en poste

             // POST: Users/DetailsUser/5/{idEquipment}
                    // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
                    // plus de détails, voir  https://go.microsoft.com/fwlink/?LinkId=317598.
                    [HttpPost]
                    [ValidateAntiForgeryToken]
                    public ActionResult DetailsUser(UsersModelView userModel, users editUser, int? idEquipment)
                    {
                        // Si l'utilisateur veux éditer alors je rentre dans la condition
                        if (Request.Form["submitbutton1"] != null)
                        {
                            if (ModelState.IsValid)
                            {
                                try
                                {
                                    editUser = userModel.user;
                                    db.Entry(editUser).State = EntityState.Modified;
                                    db.SaveChanges();
                                }
                                catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
                                {
                                    Exception raise = dbEx;
                                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                                    {
                                        foreach (var validationError in validationErrors.ValidationErrors)
                                        {
                                            string message = string.Format("{0}:{1}",
                                                validationErrors.Entry.Entity.ToString(),
                                                validationError.ErrorMessage);
                                            // raise a new exception nesting
                                            // the current instance as InnerException
                                            raise = new InvalidOperationException(message, raise);
                                        }
                                    }
                                    throw raise;
                                }
            
                                return RedirectToAction("DetailsUser");
                            }
                        }
                        //si l'utilisateur veux supprimer alors j'appelle la méthode de mon controller DeleteEquipment()
                        else if (Request.Form["submitButton2"] != null)
                        {
                            
                            this.DeleteEquipment(userModel,  (int)idEquipment);
                        }
            
            
                        return View(userModel);
                    }

            ma méthode deleteEquipment :

            ///*
                    // * delete un equipment
                    // * */
                    public ActionResult DeleteEquipment(UsersModelView userModel, int idEquipment)
                    {
                        equipments equipSearch = new equipments();
            
                        //Chercher dans la base de donné l'equipment correspondant à id equipment
                       // equipSearch = EquipmentMethod.equipmentObtain(idEquipment);
            
                        //Supprime dans la base de donnée l'equipment IdEquipment relier à l'id de l'utilisateur sur la page profil userModel.user.id
                        var link = new users_has_equipments { users_id = userModel.user.id, equipments_id = idEquipment };
                        db.users_has_equipments.Remove(link);
            
                        db.SaveChanges();
                        return RedirectToAction("DetailsUser");
            
            
                    }
            


            ici, j'ai du mettre dans ma méthod post DetailUser, j'ai mis pour la route et en paramètre

            /{idEquipment}
            int? idEquipment)

            et j'ai convertie pour utiliser ma méthode : 

            this.DeleteEquipment(userModel,  (int)idEquipment);

            Pour moi à cette endroit, il à peut-être un problème . Ma route dans RouteConfig est de cette forme 

            url: "{controller}/{action}/{id}",

            et non :  // POST: Users/DetailsUser/5/{idEquipment}

            Je me suis dit que je pouvais mettre des paramètre optionnelle est les changer après dans ma vue, comme ça je n'ai pas besoin de modifier ma route..
            J'ai vue que pour mettre des paramètre optionnelle fallait mettre les valeurs à 0 ou null, alors j'essaye 

            public ActionResult DetailsUser(UsersModelView userModel, users editUser, int id , int? idEquipment)
                    {
                        // Si l'utilisateur veux éditer alors je rentre dans la condition
                        if (Request.Form["submitbutton1"] != null)
                        {
                            if (ModelState.IsValid)
                            {
                                try
                                {
                                    editUser = userModel.user;
                                    db.Entry(editUser).State = EntityState.Modified;
                                    db.SaveChanges();
                                }
                                catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
                                {
                                    Exception raise = dbEx;
                                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                                    {
                                        foreach (var validationError in validationErrors.ValidationErrors)
                                        {
                                            string message = string.Format("{0}:{1}",
                                                validationErrors.Entry.Entity.ToString(),
                                                validationError.ErrorMessage);
                                            // raise a new exception nesting
                                            // the current instance as InnerException
                                            raise = new InvalidOperationException(message, raise);
                                        }
                                    }
                                    throw raise;
                                }
            
                                return RedirectToAction("DetailsUser");
                            }
                        }
                        //si l'utilisateur veux supprimer alors j'appelle la méthode de mon controller DeleteEquipment()
                        else if (Request.Form["submitButton2"] != null)
                        {
                            
                            this.DeleteEquipment(userModel,  (int)idEquipment);
                        }
            
            
                        return View(userModel);
                    }

            toujours pareille ma valeur idEquipment par défaut ne change, elle est toujours null (ou zéro si je mes ma valeur par défaut à 0). Pourtant dans ma view, j'instancie mon objet : 

            <input class="btn-sm ButtonChangePC col-3" type="submit" name="submitbutton2" href="@Url.Action("DetailUser", "Users", new { idEquipment = eq.id })" v-on:click=btnChangePCIsActive() value="Suprimer" />

            Ici deux interrogations. Si je cliques sur le button submit, alors j'appelle ma méthode DetailUser en POST , et pour mettre des valeurs à IdEquipment j'utilise URL.Action, et j'ai vu qu'URL.Action , n'utiliser pas les POST (du moins je crois^^") . Est-ce-que c'est pour cette raison que je n'arrive pas à récupérer la valeur de mon idEquipment? Si c'est ça, alors je dois faire comment? ... ^^" utiliser du Javascript avec Ajax ? 

            Tu m'as dit : 

            Or, dans tes return vers "DetailsUser", tu ne renseignes aucun paramètre dans tous les cas que je vois ... 

            j'ai essayer en post de retourner idEquiment : L'éditeur n'aime pas que retourne userModel ET idEquipment, mais de toute façon je m'arrete avant car IDEquipment est  null. 

            public ActionResult DetailsUser(UsersModelView userModel, users editUser, int id , int? idEquipment)

            Merci pour ton aide ;)



            -
            Edité par Cielphis 5 mars 2019 à 12:56:54

            • Partager sur Facebook
            • Partager sur Twitter
              13 mars 2019 à 16:48:42

              Hello !

              Je crois que je t'ai oublié sur ce sujet ^^

              Tu as réussi à t'en sortir ?

              o/

              • Partager sur Facebook
              • Partager sur Twitter
              Insanity is doing the exact same fuckin' thing over and over again, expecting shit to change...
                21 mars 2019 à 15:09:58

                Bonjour Nairowyn, désolé de répondre que mainteant X.x..

                Je tiens à te dire que j'ai terminé mon stage, et que celà c'est très très bien passé. J'ai appris énormément de choses alors que j'avais jamais fait de c# et de Asp.net.. et c'est beaucoup grâce à la communauté d'openclassroom (d'ailleurs tu es venu plusieurs fois m'aider^^),  les employés dans cette boîte sont super occupé, que c'était difficile d'obtenir de l'aide.

                J'ai réussi à supprimer le bon PC , pour cela j'ai rajouté une propriété dans mon viewModel idEquipementView et dans mon html :

                 <input type='hidden' name="idEquipmentView" value="@eq.id" />

                comme ça je suis sûr qu'avec une méthode POST, je peux récupère la valeur.. par contre je dois gérer avec  le javascript l'affichage du button name idquipmentView pour avoir le bon équipement lors du clique. ( si je ne fait ça, j'ai plusieurs input idEquipmentView, donc m'à valeur est "écrasé", et par défaut je supprimer le 1er de la liste ).

                et au final dans mon controller : 

                 //si l'utilisateur veux supprimer alors j'appelle la méthode de mon controller DeleteEquipment()
                                else if (Request.Form["submitButton2"] != null)
                                {
                                    equipments equipSearch = new equipments();
                
                
                                    //Chercher dans la base de donné l'equipment correspondant à id equipment
                                    equipSearch = EquipmentMethod.equipmentObtain(userModel.idEquipmentView);
                
                                    var test = db.users_has_equipments.Where(x => x.equipments_id.Equals(userModel.idEquipmentView) && x.users_id.Equals(userModel.user.id)).FirstOrDefault();
                                    if (test != null)
                                    {
                                        db.users_has_equipments.Remove(test);
                                        db.SaveChanges();
                
                                    }
                
                                    return RedirectToAction("DetailsUser");
                
                                }

                et pour le javscript c'est du vue Js avec if else ^^ .

                Merci, bonne journée ^^

                • Partager sur Facebook
                • Partager sur Twitter
                  21 mars 2019 à 15:41:38

                  Bonjour Cielphis,

                  Ok parfait alors ! :)

                  Content d'avoir pu t'aider ^^

                  Bonne journée également !

                  o/

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Insanity is doing the exact same fuckin' thing over and over again, expecting shit to change...

                  Recupérer l'id du PC que je souhaite supprimer

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown