2

我已经为此苦苦挣扎了好几天。我需要用流派填充下拉列表。

我的 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() 方法,并且此方法无法转换为存储的表达式。

电影控制器,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)

任何帮助将不胜感激!


更新:

存储库:

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)    
4

1 回答 1

3

由于无论如何您都在检索所有记录,因此您可以这样做。

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(),因为它已经处于即时状态。

于 2013-03-23T17:15:40.787 回答