ASP.NET MVC - HTML 错误“没有 IEnumerable<SelectListItem> 类型的 ViewData”

问题描述

这只是一个简单的应用程序,它允许我通过 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

请仔细检查这个