1
votes

Supprimer une ligne d'une table et passer un indicateur booléen à l'API, sans supprimer l'objet réel

Je fais un spa avec AngularJS et je consomme une api avec mvvm en C #.

Je peux supprimer une ligne après avoir cliqué sur le bouton de suppression, mais sur le serveur, je veux seulement changer un indicateur booléen en true par en conservant les données dans Sql Server.

J'ai essayé d'autres méthodes, et j'ai même supprimé l'objet via Postman, mais je ne veux pas supprimer mais seulement changer une propriété booléenne pour l'enregistrement qui ne existe dans ma table de visualisation.

Je laisse mon code pour qu'il soit mieux compris.

Toute aide est la bienvenue.

J'ai essayé de passer l'id et l'objet dans le contrôleur api, similaire à http.put, car je veux changer une propriété booléenne, donc je voulais garder l'id, le nom, le nom, l'e-mail et isdelete qu'après le clic, change pour supprimer la ligne dans la vue devient vrai dans la base de données.

[HttpPut]
    [Route("api/UserAPI")]
    public HttpResponseMessage Delete(UserViewModel uservm)
    {
        try
        {                                
            var registerDeleted = ctx.User.Find(uservm.UserId);
            uservm.IsDelete = false;
            uservm.IsActive = true;
            if (registerDeleted != null)
            {
                uservm.IsActive = false;
                uservm.IsDelete = true;
                registerDeleted.Name = uservm.Name;
                registerDeleted.LastName = uservm.LastName;
                registerDeleted.IsActive = uservm.IsActive;
                registerDeleted.Email = uservm.Email;
                registerDeleted.IsDelete = uservm.IsDelete;
                ctx.Entry(registerDeleted).State = System.Data.Entity.EntityState.Modified;

                ctx.SaveChanges();
                return Request.CreateResponse(HttpStatusCode.OK);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "User not found");
            }
        }
        catch (Exception ex)
        {

            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }

    }

Mon controller.js:

 $scope.deleteRegister = function (register) {
    var index = -1;
    var listOfRegister = eval($scope.registers);
    for (var i = 0; i < listOfRegister.length; i++) {
        if (listOfRegister[i].register === register) {
            index = i;
            break;
        }
    }
    if (index === -1) {
        alert("Something gone wrong");
    }
    $scope.registers.splice(index, 1);
    $http({
        method: 'Delete',
        url: 'http://localhost:51734/api/UserAPI/',

    }).then(function (res) {
        alert('Exc');
        $scope.GetAllRegisters();
    })
};

Et mon controller.api:

 <tbody>
                <tr ng-repeat="register in registers">
                    <td style="display:none">{{register.UserId}}</td>
                    <td>{{register.Name}}</td>
                    <td>{{register.LastName}}</td>
                    <td><input type="checkbox" ng-model="register.IsActive" disabled /></td>
                    <td>{{register.Email}}</td>
                    <td>
                        <a ng-click="editRegister($event, register)" class="glyphicon glyphicon-edit"></a>
                    </td>
                    <td>
                        <a href="" ng-click="deleteRegister()" class="glyphicon glyphicon-trash"></a>
                    </td>
                </tr>
            </tbody>

Merci !


3 commentaires

Vous avez donc un tableau et lorsque vous cliquez sur l'icône de suppression, vous voulez que la ligne soit supprimée, est-ce exact? le côté db / api fonctionne-t-il également? et ce n'est qu'un problème d'interface utilisateur de mise à jour du modèle actuel.


D'accord, lorsque je clique sur l'icône de suppression, je peux supprimer la ligne, comme vous me l'avez dit, cela réduit le code, le rendant plus propre et plus facile. Maintenant, je veux changer la propriété de l'objet sur true. Supprimez l'enregistrement de vue mais conservez-le dans la base de données / avec le statut isDelete à true.Avec le même id, nom, lastName, isActive = false, Email et isDelete = true.Je ne souhaite pas supprimer définitivement les données d'objet de la base de données / . Je veux conserver l'enregistrement mais avec la propriété fonctionnant avec un indicateur de isDelete à true lors de la suppression de l'objet de la vue.


ive a mis à jour la réponse pour vous, mais comme Andrei Dragotoniu l'a mentionné, vous pouvez simplement passer le userId et non l'intégralité du UserViewModel, ce qui rendrait votre code plus net et moins à gérer.


3 Réponses :


1
votes

Si l'API est le problème, vous définissez uservm.IsDelete = false; puis définissez registerDeleted.IsDelete = uservm.IsDelete; donc ce serait toujours false dans la base de données.

Si le modèle est le problème, je recommanderais d'obtenir l ' index à partir de data-ng-repeat , cela réduirait le quantité de code que vous avez écrite et vous permettre de voir plus facilement ce qui se passe.

Cela supprimera la ligne du tableau:

var registerDeleted = ctx.User.Find(uservm.UserId);
if (registerDeleted != null)
{
    registerDeleted.IsDelete = true;
    registerDeleted.IsActive = false
    ctx.SaveChanges();
}

Mise à jour à partir du commentaire:

Vous devez récupérer l'objet, puis effectuer la modification et l'enregistrer.

<tr data-ng-repeat="(index, register) in registers">    
     <td>
       <a href="data-ng-click="deleteRegister()" class="glyphicon glyphicon-trash"></a>
    </td>
</tr>      

$scope.deleteRegister = function (index) {
   $scope.registers.splice(index, 1);
}


2 commentaires

Le problème est qu'il supprime l'objet de mon view.cshtml, mais je veux faire une promisse dans la méthode $ scope.deleteRegister qui a appelé mon controller.api pour que l'objet continue avec les mêmes valeurs de données dans bd / mais avec un indicateur défini sur true, après avoir cliqué sur l'icône pour supprimer l'enregistrement.


Le code qui remplit les registres en premier lieu vérifie sûrement que l'indicateur isDelete = false? pouvez-vous mettre à jour votre question avec le code $ scope.GetAllRegisters () s'il vous plaît



2
votes

ce dont vous parlez est la suppression progressive de lignes de données. dans la base de données, ajoutez un nouveau champ booléen appelé Status ou IsDeleted ou ce que vous voulez, avec une valeur par défaut de false . Lorsque vous cliquez sur le bouton Supprimer de l'interface utilisateur, émettez une demande pour simplement mettre à jour cet indicateur de false à true

Lorsque vous demandez la liste des éléments à afficher sur le UI, ils retournent ceux où l'indicateur est défini sur false .

C'est essentiellement l'idée derrière la suppression logicielle des données. Vous marquez seulement que les données sont supprimées, vous ne les supprimez pas réellement.

Si vous le souhaitez, plus tard, vous pouvez ajouter un processus où vous déplacez les données supprimées de manière réversible vers une table archivée, juste pour conserver les rangé. Faire les choses de cette manière présente l'avantage supplémentaire que vous pouvez toujours annuler la suppression des données, si vous en avez besoin. Tout ce dont vous avez vraiment besoin est de remettre le drapeau à false et vous avez terminé, tout fonctionne et les données s'affichent.

Un dernier point de ma part, si vous tous voulez faire est de supprimer un élément, puis tout ce dont vous avez besoin est de transmettre l'identifiant de l'enregistrement. vous n'avez pas à vous soucier des modifications apportées aux autres champs. Normalement, vous ne mettriez pas à jour les informations ET ne les supprimeriez pas en même temps. Alors créez un contrôleur simple qui répond à PUT, par exemple:

[HttpPut]
    [Route("api/UserAPI")]
    public HttpResponseMessage Delete(int userId)
    {                                       
         var foundUser = ctx.User.Find(userId);
         foundUser.IsDeleted = true;
         ctx.SaveChanges();
    }

bien sûr, ajoutez toute votre validation, les codes de retour, tout ce dont vous avez besoin, mais c'est essentiellement tout ce dont vous avez besoin .

N'oubliez pas de changer la méthode qui renvoie les utilisateurs actifs, pour ignorer ceux où l'indicateur IsDeleted est vrai.


1 commentaires

C'est exactement ce que je veux faire, mais je ne peux pas obtenir mon controller.js dans la méthode $ scope.deleteRegister pour appeler le PUT dans mon controller.api. J'ai changé le code comme vous me l'avez dit, cela donne l'erreur suivante: ReferenceError: userId n'est pas défini chez ChildScope. $ scope.deleteRegister (registerController.js: 38). Je vais laisser mon code comme une nouvelle question, afin que vous puissiez m'aider, si possible, merci!



0
votes

Maintenant, je sais déjà comment supprimer un enregistrement de mon View.index, qui est avec splice dans mon controller.js

      <tr ng-repeat="(index, register) in registers">
        <td>
          <a href="" ng-click="deleteRegister()" class="glyphicon glyphicon-trash"></a>
         </td>
      </tr>

Mais je ne peux pas le faire communiquer avec ma méthode dans mon controller.api, je souhaite modifier uniquement l'indicateur isDelete = true, après avoir cliqué sur le bouton de suppression de mon interface utilisateur.

Mon controller.api

//DELETE: api/UserAPI/5
    [HttpPut]
    [Route("api/UserAPI")]
    public HttpResponseMessage Delete(int userId)
    {
        try
        {
            var foundUser = ctx.User.Find(userId);

            if (foundUser != null)
            {
                foundUser.IsDelete = true;
                ctx.SaveChanges();
                return Request.CreateResponse(HttpStatusCode.OK);
            }
}

Et mon view.index

$scope.deleteRegister = function (index) {

    $scope.registers.splice(index, 1);
    $http({
        method: 'PUT',
        url: 'http://localhost:51734/api/UserAPI/',
    }).then(function (res) {
        alert('Exc');
        $scope.GetAllRegisters();
    })

};


0 commentaires