2011-07-18 80 views
2

嗨,我經歷的教程在:MVC的ViewModels節省

http://www.asp.net/mvc/tutorials/mvc-music-store-part-1

而不是使用ViewBag我試圖得到它使用的ViewModels的。

的創建GET變成了:

public ActionResult Create() 
{ 
    return View(); 
} 

的建立訊息現在有一個AlbumViewModel:

[HttpPost] 
public ActionResult Create(AlbumViewModel albumViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     //db.Albums.Add(albumViewModel); 
     //db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(albumViewModel); 
} 

視圖模型是包含流派的下拉列表,而不是將它們與ViewBag。

的AlbumViewModel類是:

public class AlbumViewModel 
{ 
    public Album Album { get; set;} 
    public SelectList Genres = new SelectList(repository.Genres, "Name", "Id"); 
} 

正如你可以看到從創建文章中,我不知道該如何保存新創建專輯GenreId

有人可以告訴我你是如何做到這一點的?

+0

其他教程系列節目你如何在你的http獲取create方法中保存實體 – Eranga

+0

你沒有通過albumViewmodel,所以如何在首次加載頁面時呈現選擇列表 –

回答

4

您必須將視圖模型映射回EF域模型(相冊)以保存更改。我個人使用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); 
}