В базе данных есть таблица пользователя и студента. Я сгенерировал модель, используя Entity Framework. Поскольку в этом сгенерированном классе ученика были поля только от ученика, но не от пользователя формы, я создал свой собственный ученический класс со всеми этими полями, которые будут использоваться как viewmodel.
Я использую свой ViewBag для передачи данных для раскрывающегося списка в моем представлении.
ViewBag.Programs = Entities.Programs;
Программы - это учебные программы в университете (например, информатика, юриспруденция и т. Д.)
Таким образом, это отношения 1: N, где ученик может участвовать только в одной программе, но программа может изучаться большим количеством учеников.
И, на мой взгляд, я использую DropDownFor, чтобы создать выпадающий список, из которого программа назначается студентам, когда новый студент добавляется в базу данных.
<div class="editor-field">
@Html.DropDownListFor(model => model.ProgramID, ((IEnumerable<SSVN.Models.Program>)ViewBag.Programs).Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Name),
Value = option.ID.ToString(),
Selected = (Model != null) && (option.ID == Model.ID)
}), "Choose...")
@Html.ValidationMessageFor(model => model.ProgramID)
</div>
Проблема в том, что когда я нажимаю кнопку отправки формы, появляется эта ошибка:
Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым.
Имя параметра: источник
@Html.DropDownListFor(model => model.ProgramID, ((IEnumerable<SSVN.Models.Program>)ViewBag.Programs).Select(option => new SelectListItem
Эта часть model => model.ProgramID
делает ошибку
Ну, я попытался упростить проблему, чтобы не было ничего непонятного для вас, поэтому я перевел свой код на английский, поскольку реальный код больше на моем родном языке.
Я думаю, что есть ошибка, потому что это то, что говорит браузер. Вот код в оригинале:
РЕДАКТИРОВАТЬ ПОЛУЧИТЬ ДЕЙСТВИЕ
// GET: /Unija/Studenti/Izmeni
public ActionResult Izmeni(int ID)
{
ViewBag.StudProgrami = Entities.Studijski_Program;
SSVN.ModelView.Student student = new SSVN.ModelView.Student();
SSVN.Models.Student stud = Entities.Students.Single(x => x.ID == ID);
Korisnik korisnik = Entities.Korisniks.Single(s => s.ID == ID);
student.ID = korisnik.ID;
student.KorisnickoIme = korisnik.Korisnicko_Ime;
student.Lozinka = korisnik.Lozinka;
student.Ime = stud.Ime;
student.Prezime = stud.Prezime;
student.BrojIndeksa = stud.Broj_Indeksa;
student.TrenutniSemestar = stud.Trenutni_Semestar;
student.StudijskiProgramID = stud.Studijski_Program_ID;
return View(student);
}
РЕДАКТИРОВАТЬ ПОЧТОВЫЙ ДЕЙСТВИЕ
// POST: /Unija/Studenti/Izmeni
[HttpPost]
public ActionResult Izmeni(SSVN.ModelView.Student student)
{
if (ModelState.IsValid)
{
Korisnik korisnikToUpdate = Entities.Korisniks.Single(x => x.ID == student.ID);
korisnikToUpdate.Korisnicko_Ime = student.KorisnickoIme;
korisnikToUpdate.Uloga_ID = Entities.Ulogas.SingleOrDefault(x => x.Naziv == "Student").ID;
Entities.SaveChanges();
SSVN.Models.Student studentToUpdate = Entities.Students.Single(x => x.ID == student.ID);
studentToUpdate.Ime = student.Ime;
studentToUpdate.Prezime = student.Prezime;
studentToUpdate.Broj_Indeksa = student.BrojIndeksa;
studentToUpdate.Trenutni_Semestar = student.TrenutniSemestar;
studentToUpdate.Studijski_Program_ID = student.StudijskiProgramID;
Entities.SaveChanges();
return RedirectToAction("Index");
}
return View(student);
}
VIEW
@model SSVN.ModelView.Student
@{
ViewBag.Title = "Izmeni";
}
<h2>Dodaj</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Student</legend>
<div class="hidden-field">
@Html.HiddenFor(model => model.ID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.KorisnickoIme)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.KorisnickoIme)
@Html.ValidationMessageFor(model => model.KorisnickoIme)
</div>
<input type="hidden" name="Lozinka" value="lozinka" />
<div class="editor-label">
@Html.LabelFor(model => model.Ime)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Ime)
@Html.ValidationMessageFor(model => model.Ime)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Prezime)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Prezime)
@Html.ValidationMessageFor(model => model.Prezime)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.BrojIndeksa)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.BrojIndeksa)
@Html.ValidationMessageFor(model => model.BrojIndeksa)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.TrenutniSemestar)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.TrenutniSemestar)
@Html.ValidationMessageFor(model => model.TrenutniSemestar)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StudijskiProgramID)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.StudijskiProgramID, ((IEnumerable<SSVN.Models.Studijski_Program>)ViewBag.StudProgrami).Select(option => new SelectListItem
{
Text = (option == null ? "None" : option.Naziv),
Value = option.ID.ToString(),
Selected = (Model != null) && (option.ID == Model.ID)
}), "Izaberite")
@Html.ValidationMessageFor(model => model.StudijskiProgramID)
</div>
<p>
<input type="submit" value="Izmeni" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>