Отправка / размещение данных коллекции из формы HTML / Razor в модель аргумента действия MVC
Я работаю над проектом, чтобы помочь студентам и консультантам выбрать лучшие курсы для следующего семестра, используя ASP.NET MVC 5. Первым шагом для студента является выбор курсов, которые он уже выбрал из списка. Контроллер, который отображает список:
public ActionResult AddCourseVM (int? id)
{
Student student = db.Students.Find(id);
// List<BaseCourse> potentialCourses = student.StudentConcentration.RequiredCourses.ToList();
List<BaseCourse> potentialCourses = db.BaseCourses.ToList();
AddCourseViewModel vModel = new AddCourseViewModel(student, potentialCourses);
List<Course> listCourses = new List<Course>();
foreach(BaseCourse baseC in potentialCourses)
{
Course c = new Course();
c.BaseCourse = baseC;
c.Student = student;
listCourses.Add(c);
}
vModel.PossibleCourses = listCourses;
return View("AddCourseVM", vModel);
}
ViewModel это:
public class AddCourseViewModel
{
public Student Student { get; set; }
public List<BaseCourse> AvailCourses { get; set; }
public List<Course> PossibleCourses { get; set; }
public AddCourseViewModel(Student s, List<BaseCourse> c)
{
Student = s;
AvailCourses = c;
PossibleCourses = new List<Course>();
}
public AddCourseViewModel()
{
Student = new Student();
AvailCourses = new List<BaseCourse>();
PossibleCourses = new List<Course>();
}
}
Объекты курса - это конкретные экземпляры курса (для данного учащегося, в определенном семестре и т. Д.), Объекты BaseCourse - это отдельные курсы из каталога курсов.
Я отображаю возможные курсы в списке, используя этот вид:
@model CMPSAdvising.ViewModels.AddCourseViewModel
@{
ViewBag.Title = "AddCourseVM";
}
<h2>Add Courses</h2>
<div>
<p>Name: @Model.Student.FirstName @Model.Student.LastName</p>
<p>W#: @Model.Student.WNumber</p>
</div>
<div>
<p>Select the Courses You Have Taken</p>
</div>
<div>
@using (Html.BeginForm("AddCourseVM","Students"))
{
@Html.AntiForgeryToken();
<div>
<table class="table table-bordered">
<tr>
<th>Course</th>
<th>Department</th>
<th>Number</th>
<th>Check if Taken</th>
<th>Semester</th>
<th>Grade</th>
</tr>
@foreach (var course in Model.PossibleCourses)
{
<tr>
<td>@course.BaseCourse.Name</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@course.BaseCourse.CourseNumber</td>
<td>@Html.CheckBoxFor(s => course.Selected)</td>
<td>@Html.TextBoxFor(m => course.Semester)</td>
<td>@Html.TextBoxFor(g => course.Grade)</td>
</tr>
}
</table>
<input type="submit" value="Save Classes Taken" class="btn btn-default" />
</div>
}
</div>
И, наконец, контроллер, который получает POST, когда пользователь нажимает кнопку:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddCourseVM (AddCourseViewModel vModel)
{
Student stu = vModel.Student;
foreach (Course c in vModel.PossibleCourses)
{
if (c.Selected)
{
stu.CoursesTaken.Add(c);
}
}
db.Entry(stu).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("ListTakenCourses", new { id = stu.ID });
}
Моя проблема заключается в том, что объект AddCourseViewModel (vModel) возвращается ноль. Я хотел бы вернуть ViewModel с веб-страницы в виде объекта или, по крайней мере, получить список проверенных курсов и идентификатор студента.