Удаление строки из таблицы и передача логического флага в API, без удаления реального объекта - PullRequest
0 голосов
/ 06 февраля 2019

Я делаю спа с AngularJS и потребляю API с mvvm в C #.

Я могу удалить строку после нажатия кнопки удаления, но на сервере я хочу только изменить логический флагв true, сохраняя данные в Sql Server.

Я пробовал другие способы, и я даже удалял объект через Postman, но я не хочу удалять, а только изменяю логическое свойство на запись, котораябольше не существует в моей таблице просмотра.

Я оставлю свой код, чтобы его можно было лучше понять.

Любая помощь приветствуется.

Я пытался передатьid и объект в контроллере API, похожий на http.put, потому что я хочу изменить логическое свойство, поэтому я хотел сохранить идентификатор, имя, фамилию, адрес электронной почты и isdelete, что после щелчка изменяется, чтобы удалить строку впредставление становится истинным в базе данных.

 <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>

Мой 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();
    })
};

И Мой controller.api:

[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);
        }

    }

Спасибо!

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

то, о чем вы говорите - это мягкое удаление строк данных.в базе данных добавьте новое логическое поле с именем Status или IsDeleted или любым другим, со значением по умолчанию false .Когда вы нажмете кнопку «Удалить» в пользовательском интерфейсе, создайте запрос, чтобы просто обновить этот флаг с false до true

Когда вы запрашиваете список вещей для отображения напользовательский интерфейс возвращает те, для которых установлен флаг false .

Это основная идея программного удаления данных.Вы только отмечаете, что данные удалены, но фактически не удаляете их.

Если хотите, позже вы можете добавить процесс, в котором вы перемещаете мягко удаленные данные в заархивированную таблицу, просто чтобы сохранить порядок.,Подобные действия имеют дополнительное преимущество: вы всегда можете восстановить данные, если вам это нужно.Все, что вам действительно нужно, это изменить флаг обратно на false , и все готово, все работает и данные отображаются.

Один последний момент от меня, если вы все, что вы хотитеВы можете удалить элемент, и все, что вам нужно, это передать идентификатор записи.вам не нужно беспокоиться об изменениях в других областях.Обычно вы не обновляете информацию и не удаляете ее одновременно.Поэтому создайте простой контроллер, который отвечает на PUT, например:

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

, конечно, добавьте всю свою проверку, коды возврата, все, что вам нужно, но это, по сути, все, что вам нужно.

Не забудьте изменить метод, который возвращает активных пользователей, чтобы игнорировать тех, для которых флаг IsDeleted имеет значение true.

0 голосов
/ 06 февраля 2019

Теперь я уже знаю, как удалить запись из моего View.index, которая с использованием splice в моем controller.js

$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();
    })

};

Но я не могу заставить ее общаться с моим методом в моем контроллере.api, я хочу изменить только флаг isDelete = true, после нажатия кнопки удаления в моем пользовательском интерфейсе.

Мой 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);
            }
}

И мой view.index

      <tr ng-repeat="(index, register) in registers">
        <td>
          <a href="" ng-click="deleteRegister()" class="glyphicon glyphicon-trash"></a>
         </td>
      </tr>
0 голосов
/ 06 февраля 2019

Если API является проблемой, которую вы устанавливаете uservm.IsDelete = false;, то устанавливаете registerDeleted.IsDelete = uservm.IsDelete;, поэтому в базе данных всегда будет false .

Если шаблон является проблемой, я бырекомендуем получить index из data-ng-repeat, это уменьшит объем написанного вами кода и упростит просмотр происходящего.

Это удалит строку из таблицы:

<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);
}

Обновление из комментария:

Вам необходимо получить объект, затем внести изменения и сохранить его.

var registerDeleted = ctx.User.Find(uservm.UserId);
if (registerDeleted != null)
{
    registerDeleted.IsDelete = true;
    registerDeleted.IsActive = false
    ctx.SaveChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...