在数据库中我有表用户和学生。我使用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:值不能为null。 参数名称:source
@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);
}
查看
@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>
答案 0 :(得分:1)
当您尝试在其上调用.Select扩展方法时,Entities.Programs
似乎返回null
并在视图内部获得此异常。或者你可能将这个DropDownListFor
放在一个视图中,该视图是从一个控制器动作渲染的,它没有在ViewBag.Programs
内放置任何东西。
我个人会使用视图模型。
所以让我们从定义一个开始:
public class ProgramsViewModel
{
public string ProgramID { get; set; }
public IEnumerable<SelectListItem> Programs { get; set; }
}
然后有一个控制器动作,它将负责填充这个视图模型:
public ActionResult Foo()
{
var model = new ProgramsViewModel
{
Programs = Entities.Programs.Select(p => new SelectListItem
{
Value = p.ID,
Text = p.Name
})
};
return View(model);
}
并在视图中:
@Html.DropDownListFor(
model => model.ProgramID,
new SelectList(Model.Programs, "Value", "Text")
"Choose..."
)
如果您想预先选择下拉列表中的某些选项,只需将视图模型的ProgramID
属性设置为控制器中的相应值:
// Preselect the option with value="123"
model.ProgramID = "123";
答案 1 :(得分:0)
我的ModelState无效,因此控制器返回了相同的视图。 但是因为在这个控制器中我没有定义ViewBag列出我的DropDownList引发的Null异常。
我只需要通过ViewBag传递这些列表。
ViewBag.Katedre = Entities.Katedras;
ViewBag.Uloge = (System.Data.Objects.ObjectQuery<Uloga>)Entities.Ulogas.Where(x => (x.Naziv == "Profesor" || x.Naziv == "Asistent")).AsEnumerable();
return View(predavac);
这是问题。