ahmed_sa Ответов: 1

Не удается сохранить изменения курсов, если удалить в edit httppost


Проблема

при удалении курса нажмите кнопку Отправить не сохранять изменения хотя

он удален со стороны клиента с помощью jquery

Подробности

в режиме редактирования для каждого сотрудника мне нужно внести изменения, удалив или добавив новые курсы для каждого сотрудника.

работник

если я добавлю новые курсы, то нажмите кнопку Отправить, чтобы сохранить то, что я делаю

но если я удалю курс из курсов то нажмите кнопку Отправить он не сохранит курсы я

удаленный

так что мне нужно проверить, что не так в моем коде

мой код работает без каких-либо проблем, но только есть проблема

я не могу сохранить курсы удаленные в базе данных в таблице employeecourse при нажатии кнопки Отправить

таблица employeecourse иметь удостоверение личности,Кодсотрудника,Идентификатор_курса

jquery remove client side прилагается к моему вопросу

код

[HttpPost]  
                    public ActionResult Edit(EditEmployeeVm model)  
                    {  
                        var emp = db.Employees.FirstOrDefault(f => f.Id == model.Id);  
                        foreach (var couseid in model.CourseIds)  
                        {  
                            db.EmployeeCourses.Add(new EmployeeCourse { CourseId = couseid, EmployeeId = emp.Id });  
                            db.SaveChanges();  
                        }  
                    
                        return View();  
            my(custom model) view model using for that  
             public class EditEmployeeVm  
                {  
                    public int Id { set; get; }  
                    public List<SelectListItem> Courses { get; set; }  
                    public int[] CourseIds { set; get; }  
                    public List<coursevm> ExistingCourses { set; get; }  
                }  
                public class CourseVm  
                {  
                    public int Id { set; get; }  
                    public string Name { set; get; }  
                }  
            }

чтобы увидеть, что мне нужно на изображении ниже
Простой обмен файлами и их хранение.[^]

Что я уже пробовал:

не удается сохранить изменения курсов, если удалить в edit httppost

Philippe Mori

Пожалуйста, сделайте ваш вопрос читабельным. Вы не получите большой помощи с неформатированным кодом.

Добавьте несколько пустых строк в текст. Начните свое предложение с большой буквы. Поставьте точку в конце предложения. Очень трудно прочитать ваш вопрос.

Если вы не приложите усилий к своему вопросу,мы не будем стараться ответить вам.

1 Ответов

Рейтинг:
2

David_Wimbley

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

Поскольку я ничего не знаю о вашем html/javascript, я предполагаю, что вы знаете, как делать ajax-вызовы. Бросать этот код в действие редактирования-плохая идея и будет сбивать с толку, если только вы не пытаетесь "инсценировать" удаление до нажатия кнопки отправки. Но опять же, я понятия не имею, что вы пытаетесь сделать, поэтому я дам два варианта.

1) добавьте еще одно действие к вашему контроллеру для удаления.

[HttpPost]
public JsonResult Delete(int courseId)
{
   var course = context.Courses.FirstOrDefault(m=>m.Id == courseId);
   context.Courses.Remove(course); // this may be wrong, it may be context.Remove(course)...i use a repository class so I can unit test my classes so its been a while for me to write straight EF db access code like this.

    context.SaveChanges();
   return Json(new { }, JsonRequestBehavior.AllowGet);
}


2) Если вы пытаетесь выполнить удаление после того, как отправка произошла, то вы можете сделать 2 вещи. Может постоянно удалить и заново добавить все. Или вы можете сохранить скрытую область в вашем HTML-коде, которая хранит текущую общую сумму идентификаторов вашего курса для удаления/удаления. Это может быть помещено в действие редактирования вашего контроллера

Итак, первое, что вы сделаете, это что-то вроде этого, скрытое в вашем html

<div id="things-to-hide">

</div>


Затем, нажав кнопку Удалить, вы добавите скрытый вход в div things-to-hide, который будет вести текущий подсчет идентификаторов для удаления.

Что-то вроде

// use .on instead of .click, i'm lazy and don't feel like it, although for the time it took me to type this i could have done .on
$(".remove").click(function() {
    // this is assuming you are attaching the id to the remove link as another attribute called data-id, EX:    <a href="" data-id="2">Remove</a>
   var idToRemove = $(this).data("id");
   
// i typed straight into codeproject, syntax may be a little off but you get the idea
   $("#things-to-hide").append("<input type="hidden" value=""+idToRemove+"" name="removeid" />");


});


Затем в вашей модели вам нужно добавить еще одно свойство массива int, чтобы ваша форма отправки, будь то Html.BeginForm или Ajax.BeginForm, могла автоматически сопоставить Ваш массив removeid со свойством вашей модели.

Так что что-то вроде

public class EmployeeModel
{
   public int[] removeid  {get;set;}
}



Затем в вашем контроллере вы можете сделать что-то похожее на то, что я опубликовал в варианте 1, который является циклом над массивом removeid, который должен содержать идентификаторы, которые должны быть удалены, и оставить только курсы, которые вы хотите сохранить.

Так что это будет выглядеть примерно так


[HttpPost]
public ActionResult Edit(EmployeeModel model)
{
   foreach(var id in model.removeid)
   {
      var course = context.Courses.FirstOrDefault(m=>m.Id == courseId);
      context.Courses.Remove(course); // this may be wrong, it may be       context.Remove(course)...i use a repository class so I can unit test my classes so its been a while for me to write straight EF db access code like this.

      context.SaveChanges();
   }
}


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