没有类型为“IEnumerable<SelectListItem>”的ViewData项具有键“Carrera”。

5

我在处理控制器的Post请求时遇到了问题:

[HttpGet]
public ActionResult Crear()
{
    CarreraRepository carreraRepository = new CarreraRepository();
    var carreras = carreraRepository.FindAll().OrderBy(x => x.Nombre);
    var carrerasList = new SelectList(carreras, "ID", "Nombre");
    ViewData["Carreras"] = carrerasList;

    Materia materia = new Materia();
    return View(materia);        
}

[HttpPost]
public ActionResult Crear(Materia materia, FormCollection values)
{
    if (ModelState.IsValid)
    {
        repo.Add(materia);
        repo.Save();

        return RedirectToAction("Index");
    }
    return View(materia);
}

当HttpGet操作运行时,创建表单可以正常显示。DropDownList上的值设置正确,一切都很好;当我尝试提交表单(运行HttpPost操作)时,我收到了错误消息。
有人能帮帮我吗?
是因为HttpPost没有声明ViewData吗?感谢您的帮助。
1个回答

16

由于您正在同一视图上发布,因此当您发布到Creat时,ViewData [“Carreras”]不会被创建。您必须在Post中重新加载carreras的数据。

[HttpPost]
public ActionResult Crear(Materia materia, FormCollection values)
{
    CarreraRepository carreraRepository = new CarreraRepository();
    var carreras = carreraRepository.FindAll().OrderBy(x => x.Nombre);
    var carrerasList = new SelectList(carreras, "ID", "Nombre");
    ViewData["Carreras"] = carrerasList;

    if (ModelState.IsValid)
    {
        repo.Add(materia);
        repo.Save();

        return RedirectToAction("Index");
    }
    return View(materia);
}

1
这将解决问题...由于POST和GET都需要相同的前4行代码,我建议将它们提取到一个方法中,这样它们就在一个地方。这样,如果您更改它,只需在一个地方进行即可。 - thorkia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接