Нужна помощь в извлечении динамических значений из флажков и преобразовании значений в список. ASP NET MVC

#c# #jquery #asp.net-mvc

Вопрос:

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

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

Это моя модель

 public IEnumerablelt;EmployeeCurrentUserCanAssigngt; EmployeesCurrentUserCanAssign { get; set; }  }  public class EmployeeCurrentUserCanAssign  {  public string FirstName { get; set; }  public string LastName { get; set; }  public string EmployeeId { get; set; }  }    

Таково мое Мнение

 lt;div class="modal" id="groupAssignSettingModal" tabindex="-1" role="dialog" data-backdrop="false"gt;  lt;div class="modal-dialog" role="document"gt;  lt;div class="modal-content"gt;  lt;div class="modal-header"gt;  lt;h3 class="modal-title"gt;Who would you like to add?lt;/h3gt;  lt;/divgt;  lt;div class="modal-body"gt;  lt;table class="table table-striped"gt;  lt;theadgt;  lt;trgt;  lt;thgt;Selectlt;/thgt;  lt;thgt;First Namelt;/thgt;  lt;thgt;Last Namelt;/thgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  @foreach (EmployeeCurrentUserCanAssign employee in Model.EmployeesCurrentUserCanAssign)  {  lt;trgt;  lt;tdgt;@Html.CheckBox("selectedItem", true, new {@value = @employee.EmployeeId})lt;/tdgt;  lt;tdgt;@employee.FirstNamelt;/tdgt;  lt;tdgt;@employee.LastNamelt;/tdgt;  lt;/trgt;  }  lt;/tbodygt;  lt;/tablegt;  lt;/divgt;  lt;div class="modal-footer"gt;  lt;button type="button" class="btn btn-primary" id="btnConfirmGroupAssign"gt;  Assign Checked  lt;/buttongt;  lt;button type="button" class="btn btn-secondary" data-dismiss="modal"gt;  Cancel  lt;/buttongt;  lt;/divgt;  lt;/divgt;  lt;/divgt; lt;/divgt;  

This is my Controller get and post for this modal

 [HttpGet]  public PartialViewResult AddGroup(int projectNumber)  {  ProjectDetailsDTO project;  ManageTeamModel viewModel;   project = _projectService.GetProjectDetails(projectNumber);  viewModel = MapProjectToManageTeamViewModel(project);  return PartialView("_GroupAssignModal", viewModel);  }   [HttpPost]  public ActionResult GroupAssign(int projectNumber)  {  ProjectDetailsDTO project;  ManageTeamModel viewModel;   project = _projectService.GetProjectDetails(projectNumber);  viewModel = MapProjectToManageTeamViewModel(project);   var empList = viewModel.EmployeesCurrentUserCanAssign.Select(x =gt; x.EmployeeId).ToList();  var assignedList = _projectService.GetTeamMembersDetails(projectNumber).Select(x =gt; x.EmployeeID).ToList();   foreach (var employeeId in empList)  {  try  {  if (!assignedList.Contains(employeeId))  {  _projectService.AssignTeamMember(projectNumber, employeeId, false);  }  }  catch (Exception ex)  {  continue;  }    }   return PartialView("ManageTeam", viewModel);  }  

This is my Scripts for the modal

 _ctx.on('click', '#GroupAssignModalJS', function (e) {  e.preventDefault();   teamService.addGroup(_projectNumber, function (response) {  var bsModal = $(response);  _ctx.append(bsModal);  bsModal.on('hidden.bs.modal', function () {  bsModal.remove();  });   bsModal.modal('show');  });  }); _ctx.on('click', '#btnConfirmGroupAssign', function () {  teamService.groupAssign(_projectNumber, function (response) {  _ctx.find('#groupAssignSettingModal').modal('hide');   _ctx.update(response);  location.reload();  });    });  addGroup: function () {  $.get('./Team/AddGroup', { projectNumber: arguments[0]}, arguments[1]);  }, groupAssign: function () {  $.post('./Team/GroupAssign', { projectNumber: arguments[0] }, arguments[1]);  },  

Ответ №1:

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

Моя модель осталась прежней.

Мой пост контроллеров значительно изменился, чтобы выполнить то, что мне было нужно. Основной частью было добавление коллекции форм в качестве параметра.

 [HttpPost]  public ActionResult GroupAssign(int projectNumber, FormCollection formCollection)  {  ProjectDetailsDTO project;  ManageTeamModel viewModel;     project = _projectService.GetProjectDetails(projectNumber);  viewModel = MapProjectToManageTeamViewModel(project);    Listlt;stringgt; employeeCollection = new Listlt;stringgt;();  for(int i= 0; ilt; formCollection.AllKeys.Count();   i)  {  {  employeeCollection.Add(formCollection.Get(i));  }  }   try  {  employeeCollection.RemoveAt(0);  }  catch (Exception ex)  {   return ExceptionStatusCode(ex);  }  Listlt;stringgt; selectedEmpList = new Listlt;stringgt;();    foreach(var emp in employeeCollection)  {  if (emp.StartsWith("9"))  {  selectedEmpList.Add(emp);  }  }   var empList = viewModel.EmployeesCurrentUserCanAssign.Select(x =gt; x.EmployeeId).ToList();  var assignedList = _projectService.GetTeamMembersDetails(projectNumber).Select(x =gt; x.EmployeeID).ToList();   foreach (var employeeId in empList)  {  try  {  if (!assignedList.Contains(employeeId) amp;amp; selectedEmpList.Contains(employeeId))  {  _projectService.AssignTeamMember(projectNumber, employeeId, false);  }  }  catch (Exception ex)  {  continue;  }    }   return PartialView("ManageTeam", viewModel);  }  

Мое мнение изменилось очень незначительно. Я добавил тег формы, открывающийся и закрывающийся внутри модального, и изменил кнопку на «Отправить».

 lt;div class="modal" id="groupAssignSettingModal" tabindex="-1" role="dialog" data-backdrop="false"gt;  lt;div class="modal-dialog" role="document"gt;  lt;div class="modal-content"gt;  lt;div class="modal-header"gt;  lt;h3 class="modal-title"gt;Who would you like to add?lt;/h3gt;  lt;/divgt;  lt;form id="frmConfirmGroupAssign"gt;  lt;div class="modal-body"gt;  lt;table class="table table-striped"gt;  lt;theadgt;  lt;trgt;  lt;thgt;Selectlt;/thgt;  lt;thgt;First Namelt;/thgt;  lt;thgt;Last Namelt;/thgt;  lt;/trgt;  lt;/theadgt;  lt;tbodygt;  lt;trgt;  lt;/trgt;  @foreach (EmployeeCurrentUserCanAssign employee in Model.EmployeesCurrentUserCanAssign)  {  lt;trgt;  lt;tdgt;lt;input type="checkbox" name="selectedemp" checked="checked" value="@employee.EmployeeId" /gt;lt;/tdgt;  lt;tdgt;@employee.FirstNamelt;/tdgt;  lt;tdgt;@employee.LastNamelt;/tdgt;  lt;/trgt;  }  lt;/tbodygt;  lt;/tablegt;  lt;/divgt;  lt;div class="modal-footer"gt;  lt;button type="submit" class="btn btn-primary"gt;  Assign Checked  lt;/buttongt;  lt;button type="button" class="btn btn-secondary" data-dismiss="modal"gt;  Cancel  lt;/buttongt;  lt;/divgt;  lt;/formgt;  lt;/divgt;  lt;/divgt; lt;/divgt;  

Мои сценарии для модальной отправки также немного изменились.

 _ctx.on('submit', '#frmConfirmGroupAssign', function (e) {  var data = $(this).serializeArray();  teamService.groupAssign(_projectNumber, data, function (response) {  _ctx.find('#groupAssignSettingModal').modal('hide');   _ctx.update(response);    });  e.preventDefault();  location.reload();  });  },   groupAssign: function () {  $.post('./Team/GroupAssign', { projectNumber: arguments[0], employeeId: arguments[1]}, arguments[2]);  },  

Большой вывод, который я узнал, заключался в том, как я могу использовать коллекции форм для передачи данных (в данном случае моих значений флажков) обратно в мой контроллер через jQuery. Я надеюсь, что это поможет кому-то еще, кто может столкнуться с подобной проблемой.