Стандартная практика состоит в том, чтобы передать в представление одну ViewModel.Не список ViewModels.
Итак, если я правильно понимаю ваши требования, я думаю, что ваше представление должно выглядеть следующим образом:
@model RemindUsersViewModel
...
<form asp-controller="ManageCourse" asp-action="RemindUsers" method="post">
<ul>
@for (var i = 0; i < Model.UsersNotCompleted.Count; i++)
{
<li>
<label>
<input asp-for="UsersNotCompleted[i].Selected" />
<span>@Model.UsersNotCompleted[i].Text</span>
</label>
<input type="hidden" asp-for="UsersNotCompleted[i].Text" />
</li>
}
<li>
<button type="submit">Send reminder</button>
</li>
</ul>
</form>
И подпись действия контроллера будет:
public IActionResult RemindUsers(RemindUsersViewModel model)
ОБНОВЛЕНИЕ, основанное на вашем ответе:
Вы можете изменить свою ViewModel на:
public class RemindUsersViewModel
{
public List<CourseModel> Courses { get; set; }
}
public class CourseModel
{
public List<SelectListItem> UsersCompleted { get; set; }
public List<SelectListItem> UsersNotCompleted { get; set; }
public Course Course { get; set; }
}
Затем сохранить исходную структуру вашего представления с двойным циклом for.Внешний цикл будет проходить через Courses
, а внутренний цикл будет проходить через UsersNotCompleted
.
Обратите внимание, что на вашей странице будет несколько форм.Когда вы отправляете отдельную форму, она должна отправлять подпись действия, которая выглядит следующим образом: public IActionResult RemindUsers(RemindUsersViewModel model)