mvc viewmodels保存

时间:2011-07-18 04:00:09

标签: asp.net-mvc viewmodel

您好我正在阅读教程:

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保存新创建的相册。

有人可以告诉我你是怎么做到的吗?

1 个答案:

答案 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);
}