您好我正在阅读教程:
http://www.asp.net/mvc/tutorials/mvc-music-store-part-1
我试图让它使用viewModels而不是ViewBag。
创建GET成为:
public ActionResult Create()
{
return View();
}
创建POST现在有一个AlbumViewModel:
[HttpPost]
public ActionResult Create(AlbumViewModel albumViewModel)
{
if (ModelState.IsValid)
{
//db.Albums.Add(albumViewModel);
//db.SaveChanges();
return RedirectToAction("Index");
}
return View(albumViewModel);
}
ViewModel将包含Genres下拉列表,而不是使用ViewBag传递它们。
AlbumViewModel类是:
public class AlbumViewModel
{
public Album Album { get; set;}
public SelectList Genres = new SelectList(repository.Genres, "Name", "Id");
}
正如您在创建帖子中所看到的,我不确定如何使用GenreId
保存新创建的相册。
有人可以告诉我你是怎么做到的吗?
答案 0 :(得分:4)
您必须将视图模型映射回EF域模型(Album)才能保存更改。我个人使用AutoMapper来完成这项任务,因为它简化了大部分编码。
[HttpPost]
public ActionResult Create(AlbumViewModel albumViewModel)
{
if (ModelState.IsValid)
{
var album = Mapper.Map<AlbumViewModel, Album>(albumViewModel);
db.Albums.Add(album);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(albumViewModel);
}
同样在您的GET操作中,您应该将视图模型传递给视图,否则当您尝试呈现下拉列表时,您将获得NRE:
public ActionResult Create()
{
var albumViewModel = new AlbumViewModel();
return View(albumViewModel);
}