0

Я пытаюсь получить DropDownList Для работы в ASP.NET MVC, используя значения из другой таблицы, чтобы связать модель с выбранной опцией. Полное раскрытие, я очень мало понимаю, что я делаю, и просто отработал примеры.Не удается получить DropdownListДля правильной работы

Создание DropDownList следующим образом:

@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" }) 

GenreId столбец в таблице модели.

я получаю ошибку:

An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code

Additional information: There is no ViewData item of type 'IEnumerable' that has the key 'GenreId'

ViewBag установить, как это прежде, чем идти к виду: (Id и имя столбцы в таблице Жанр)

private void SetGenreViewBag(int? GenreId= null) 
    { 
     if (GenreId== null) 

      ViewBag.GenreSelect= new SelectList(db.Genres, "Id", "name"); 

     else 

      ViewBag.GenreSelect = new SelectList(db.Genres, "Id", "name", GenreId); 

    } 

Модель имеет столбец для Идентификатор жанра.

Я думаю, что моя основная проблема заключается в том, что я не понимаю синтаксис функции DropDownListFor, плюс есть десяток различных перегрузок для нее, поэтому ее трудно расшифровать. Какова цель первого параметра с лямбдой? Кажется, что вы берете значение, указанное вами из значений списка выбора, но я не понимаю, как это связано с моделью. Не нашли ясного ответа в Интернете.

Я думал, что у меня это работает, но что-то, что я сделал, заставило его перестать работать. Я также работал над этим с DropDownList(), но я увидел, что DropDownListFor будет немного лучше, и я не смог бы правильно использовать атрибуты HTML в DropDownList().

Спасибо!

EDIT: Внутри контроллера:

public ActionResult Create() 
    { 
     SetGenreViewBag(); 
     return View(); 
    } 

ПРИМЕЧАНИЕ: В раскрывающемся списке отображаются все нужные элементы (то есть жанры), но он выходит из строя, когда я сохранить форму.

// POST: Home/Create 
    [HttpPost] 
    public ActionResult Create(Song songToCreate) 
    { 
     try 
     { 
      db.Songs.Add(songToCreate); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

Песня Модель:

namespace MyModule.Models 
{ 
using System; 
using System.Collections.Generic; 

public partial class Song 
    { 
     public int Id { get; set; } 
     public string name { get; set; } 
     public int genreId { get; set; } 
    } 
} 
+0

Где SetGenreViewBag дозвонились? –

+0

Внутри метода Create() в контроллере. Обновлен вопрос, чтобы включить это. – shim

+0

Пожалуйста, добавьте код метода 'Create' с атрибутом [HttpPost]. – ekad

ответ

1

Если у вас есть этот синтаксис

@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" }) 

Первый параметр указывает, какое свойство модели будет присвоено выбранное значение в раскрывающемся списке, который GenreId в этом случае. Я не вижу ничего плохого в том, как вы создаете раскрывающийся список, но поскольку вы получаете ошибку при сохранении формы, я думаю, что проблема заключается в методе Create с атрибутом [HttpPost] ниже.

[HttpPost] 
public ActionResult Create(Song songToCreate) 
{ 
    try 
    { 
     db.Songs.Add(songToCreate); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
} 

Я бы предположил, что ошибка происходит из-за какой-то причине внутри try блока, то код в catch блоке выполняется, и он возвращается на ту же страницу, но ViewBag.GenreSelect уже нет, так что вы получите ошибку There is no ViewData item of type 'IEnumerable' that has the key 'GenreId'. Попробуйте добавить SetGenreViewBag() внутри блока catch, поэтому ViewBag.GenreSelect будет заселен.Кроме того, добавьте (Exception ex) к catch блока, чтобы выяснить ошибку внутри блока try

[HttpPost] 
public ActionResult Create(Song songToCreate) 
{ 
    try 
    { 
     db.Songs.Add(songToCreate); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch (Exception ex) 
    { 
     SetGenreViewBag(); 
     return View(); 
    } 
} 
+0

Итак, теперь вместо сбоев он просто перезагружает страницу и ничего не сохраняет. Не затрагивает основную проблему, которая связана с тем, как я создаю список выбора ViewBag и/или линию DropDownListFor (где происходит сбой). – shim

+0

Как вы создаете «ViewBag» и используете «DropDownListFor» в порядке, ошибка возникает из-за того, что вы не возвращали «ViewBag.GenreSelect» при возврате на ту же страницу после сохранения формы. – ekad

+0

Форма не сохраняется. – shim