MVC填充外键下拉列表

时间:2013-03-23 16:59:53

标签: asp.net-mvc-3 foreign-keys html.dropdownlistfor

我这几天一直在努力。我需要用类型填充下拉列表。

我的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)    

1 个答案:

答案 0 :(得分: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(),因为它已经处于立即状态。