【问题标题】:mvc viewmodels savingmvc 视图模型保存
【发布时间】:2011-07-18 04:00:09
【问题描述】:

您好,我正在阅读教程:

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

我试图让它使用 viewModels,而不是使用 ViewBag。

创建的 GET 变成了:

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

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

谁能告诉我你是怎么做到的?

【问题讨论】:

  • 该系列的其他教程向您展示如何保存实体
  • 在你的 http Get create 方法中你没有传递albumViewmodel 那么在第一次加载页面时如何呈现选择列表

标签: asp.net-mvc viewmodel


【解决方案1】:

您必须将视图模型映射回 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);
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多