Второй параметр должен быть списком SelectListItem, чтобы вспомогательный метод мог использовать этот список для генерации опций SELECT.Но вместо этого вы пытаетесь передать навигационное свойство Teacher
!
Вы должны создать модель представления для своего представления, в которой есть свойства, принимающие входные значения формы.Поскольку вы хотите добавить раскрывающийся список в представление, добавьте 2 свойства в модель представления.один для выбранного значения и один для списка элементов, которые мы должны использовать для отображения выпадающего списка
public class CreateStudent
{
[Required]
[StringLength(100)]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required]
[StringLength(100)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
// to do : Add other properties AS NEEDED BY THE VIEW
// Do not just copy all the properties from Entity class
public List<SelectListItem> Teachers { set; get; }
[Required]
[DisplayName("Select Teacher")]
public int SelectedTeacherId { set; get; }
}
Теперь в вашем действии GET вам нужно создать объект этой модели представления, заполнить поле Teachers
свойство collection и отправка объекта в представление
public ActionResult Create()
{
var vm = new CreateStudent();
vm.Teachers = GetTeachers();
return View(vm);
}
private List<SelectListItem> GetTeachers()
{
return db.Teachers.Select(a => new SelectListItem
{
Value = a.Id.ToString(),
Text = a.Name
}).ToList();
}
Теперь в вашем представлении, строго типизированном для нашей модели представления, мы можем использовать вспомогательный метод DropDownListFor для визуализации элемента SELECT
@model CreateStudent
@using(Html.BeginForm())
{
@Html.LabelFor(a=>a.FirstName)
@Html.TextBoxFor(a=>a.FirstName)
@Html.LabelFor(a=>a.LastName)
@Html.TextBoxFor(a=>a.LastName)
@Html.LabelFor(a=>a.SelectedTeacherId)
@Html.DropDownListFor(a=>a.SelectedTeacherId , Model.Teachers, "select one")
<input type="submit" />
}
Теперь в вашем действии HttpPost используйте ту же модель представления, что и параметр метода действия, и прочитайте значения из его свойств и используйте их для создания нового объекта вашего класса сущностей и сохранения его
[HttpPost]
public ActionResult Create(CreateStudent model)
{
if(ModelState.IsValid)
{
var s = new Student { FirstName=model.FirstName };
s.LastName = model.LastName;
// to do : Map other property values as well from view model
db.Students.Add(s);
db.SaveChanges();
return RedirectToAction("Index");
}
//Make sure to RELOAD the Teachers list for dropdown
model.Teachers = GetTeachers();
return View(model);
}