问题描述
这只是一个简单的应用程序,它允许我通过 HTML 表单将音乐添加到数据库中。
发生的事情是当我尝试提交要提交到数据库中的数据时,出现此错误:
system.invalidOperationException: 没有类型的 ViewData 项 'IEnumerable' 键为 'Genre'。
此错误出现在 HTML 页面上,根据我的假设,传递的是 NULL 值而不是我选择的值。
音乐服务类:
public void AddMusic(MusicGenreArtist musicGenreArtist,string userID)
{
Music newMusic = new Music()
{
Title = musicGenreArtist.Title,num_track = musicGenreArtist.num_track,duration = musicGenreArtist.duration,DateReleased = musicGenreArtist.DateReleased,Price = musicGenreArtist.Price,Image = musicGenreArtist.Image
};
using (var context = new ForestContext())
{
musicDAO.AddMusic(newMusic,context);
Genre genre = genreDAO.GetGenre(musicGenreArtist.Genre,context);
genreDAO.AddMusicToCollection(newMusic,genre,context);
Artist artist = artistDAO.GetArtist(musicGenreArtist.Artist,context);
artistDAO.AddMusicToCollection(newMusic,artist,context);
userDAO.AddMusicToCollection(newMusic,userID,context);
}
}
流派 DAO:
public Genre GetGenre(Music music,ForestContext context)
{
IList<Genre> genres = GetGenres(context);
for (int i = 0; i < genres.Count; i++)
{
if (genres[i].Musics.Contains<Music>(music))
{
return genres[i];
}
}
return null;
}
用于音乐的 DAO:
public void AddMusic(Music music,ForestContext context)
{
context.Musics.Add(music);
context.SaveChanges();
}
音乐控制器:
public ActionResult AddMusic()
{
Helper helper = new Helper();
ViewBag.genreList = helper.GetGenreDropDown();
ViewBag.artistList = helper.GetArtistDropDown();
return View();
}
// POST: AddMusic/Create
[HttpPost]
public ActionResult AddMusic(MusicGenreArtist musicGenreArtist)
{
try
{
// Todo: Add insert logic here
musicService.AddMusic(musicGenreArtist,"user");
return RedirectToAction("GetGenre","Genre",new { id = musicGenreArtist.Genre });
}
catch
{
return View();
}
}
下拉菜单的辅助控制器:
public class Helper
{
private IGenreService genreService;
private IArtistService artistService;
public Helper()
{
genreService = new GenreService();
artistService = new ArtistService();
}
public List<SelectListItem> GetGenreDropDown()
{
List<SelectListItem> genreList = new List<SelectListItem>();
IList<Genre> genres = genreService.GetGenres();
foreach (var item in genres)
{
genreList.Add
(
new SelectListItem()
{
Text = item.Name,Value = item.ID.ToString(),Selected = (item.Name == (genres[0].Name) ? true : false)
}
);
}
return genreList;
}
public List<SelectListItem> GetArtistDropDown()
{
List<SelectListItem> artistList = new List<SelectListItem>();
IList<Artist> artists = artistService.GetArtists();
foreach (var item in artists)
{
artistList.Add
(
new SelectListItem()
{
Text = item.Name,Selected = (item.Name == (artists[0].Name) ? true : false)
}
);
}
return artistList;
}
}
}
类型模型:
public class Genre
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Music> Musics { get; set; }
}
HTML:
<div class="form-group">
@Html.LabelFor(model => model.Genre,htmlAttributes: new { @class = "control-label col-md-2"
})
<div class="col-md-10">
@Html.DropDownListFor(model => model.Genre,(List<SelectListItem>)ViewBag.genreList)
@Html.ValidationMessageFor(model => model.Genre,"",new { @class = "text-danger" })
</div>
</div>
解决方法
您在视图中发送的模型与您在控制器中等待的模型不匹配。
您的视图使用模型 Genre
但是你的控制器:
public ActionResult AddMusic(MusicGenreArtist musicGenreArtist)
正在等待MusicGenreArtist
请仔细检查这个