我这几天一直在努力。我需要用类型填充下拉列表。
我的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)
答案 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(),因为它已经处于立即状态。