2013-03-23 3 views
2

Я боролся с этим в течение нескольких дней. Мне нужно заполнить выпадающий список с жанрами.MVC заполняет выпадающее меню с внешнего ключа

Мой MovieRepository захватить жанры:

public IQueryable<Movies> MoviesAndGenres 
{ 
     get { return db.Movies.Include(m => m.parentGenre); } 
} 

Мой фильм модель

public virtual Genres parentGenre { get; set; } 

Жанр Модель:

public class Genres 
{ 
    public Genres() 
    { 
     this.movies = new HashSet<Movies>(); 
    } 

    [Key] 
    public int genreId { get; set; } 

    [Required(ErrorMessage = "A genre name is required")] 
    [StringLength(25)] 
    public String genreName { get; set; } 

    public ICollection<Movies> movies { get; set; } 
} 

Я пытаюсь передать в жанрах с списке выбора , но я получаю LINQ to Entities не распознает метод System.String To String(), и этот метод не может быть переведены в сохраненное выражение.

Фильмы Controller, addMovie действие:

ViewBag.Genres = movieRepository.MoviesAndGenres.Select(m => new SelectListItem 
     { 
      Text = m.parentGenre.genreName, 
      Value = m.parentGenre.genreId.ToString() 
     }).ToList(); 

     return View(); 

Вид:

@Html.DropDownListFor(m => m.parentGenre, (SelectList)ViewBag.Genres) 

Любая помощь будет принята с благодарностью!


Update:

Repository:

public IQueryable<Genres> MoviesAndGenres 
{ 
     get { return db.Genres; } 
} 

Контроллер:

var x = movieRepository.MoviesAndGenres.Select(m => new 
     { 
      Text = m.genreName, 
      Value = m.genreId 
     }); 

     ViewBag.Genres = new SelectList(x); 
     return View(); 

Вид:

@Html.DropDownListFor(m => m.parentGenre, (SelectList)ViewBag.Genres)  

ответ

2

Поскольку вы все равно получаете все записи, вы можете просто сделать это.

ViewBag.Genres = movieRepository.MoviesAndGenres.AsEnumerable() 
    .Select(m => new SelectListItem 
    { 
     Text = m.parentGenre.genreName, 
     Value = m.parentGenre.genreId.ToString() 
    }); 

Вы также должны изменить ваш взгляд на:

@Html.DropDownListFor(m => m.parentGenre, new SelectList(ViewBag.Genres)) 

На самом деле, лучший подход, вероятно, будет это, с тех пор он извлекает только определенные столбцы, нужно:

var x = movieRepository.MoviesAndGenres.Select(m => new 
    { 
     Text = m.parentGenre.genreName, 
     Value = m.parentGenre.genreId 
    }); 

ViewBag.Genres = new SelectList(x) 

Кроме того, ToList() больше не требуется, поскольку он уже находится в непосредственном состоянии.

+0

Это не сработает - Невозможно неявно преобразовать тип 'int' в 'string' – Andrew

+0

Я получаю эту ошибку на мой взгляд: невозможно лить объект типа 'WhereSelectEnumerableIterator'2 [MovieRental.Models.Movies, System.Web. Mvc.SelectListItem] 'для ввода' System.Web.Mvc.SelectList '. – Andrew

+0

Я изменил свое представление на код ниже, но мое раскрывающееся меню пусто. Я проверил базу данных и там есть записи. @ Html.DropDownListFor (m => m.parentGenre, (IEnumerable ) ViewBag.Genres) – Andrew

Смежные вопросы