Нет элемента ViewData типа «IEnumerable‹SelectListItem›» с ключом «Carrera».

У меня возникают проблемы при обработке запроса 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? Спасибо за помощь.


person Community    schedule 05.09.2010    source источник


Ответы (1)


Поскольку вы публикуете в том же представлении, когда вы публикуете в Creat, ViewData["Carreras"] не создается. Вы должны снова загрузить данные своих 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);
}
person rob waminal    schedule 06.09.2010
comment
Это решит проблему... Поскольку и для сообщения, и для получения нужны одни и те же первые 4 строки кода, я бы предложил извлечь их в метод, чтобы все было в одном месте. Таким образом, если вы измените его, вам нужно будет сделать это только в одном месте. - person thorkia; 06.09.2010