如何在绑定到ViewModel时更新Model?

RPM*_*984 15 asp.net-mvc model-binding updatemodel viewmodel asp.net-mvc-3

我有一个[HttpPost]像这样的动作方法签名:

[HttpPost]
public ActionResult Edit(ExistingPostViewModel model)
{
   // Save the edited Post.
}
Run Code Online (Sandbox Code Playgroud)

现在,在过去(当我没有使用ViewModels,例如R&D)时,我有一个像这样的Edit方法的实现:

[HttpPost]
public ActionResult Edit(Post model)
{
    var existingPost = repo.Find(model.Id);
    TryUpdateModel(existingPost);
    repo.Save(existingPost);  
    return RedirectToAction("Success", existingPost.Id);
}
Run Code Online (Sandbox Code Playgroud)

哪个很好用.

但我很困惑如何使上述内容适应ViewModel方法.

如果我这样做:

TryUpdateModel(existingPost)
Run Code Online (Sandbox Code Playgroud)

使用我的ViewModel方法,没有太多发生.没有错误,但没有任何更新,因为MVC将不知道如何更新Posta ExistingPostViewModel(在它之前Post- > Post).

现在,我正在使用AutoMapper.所以我想我可以从ViewModel映射到Post,然后保存帖子.

但后来我基本上压倒一切.我不想这样做,并且打败了ViewModel.

有人可以让我迷惑吗?

这似乎是一种非常常见的情况,我对人们如何解决这个问题感到非常难过.我只能看到3种可能的解决方案:

  1. 不要在HTTP POST中使用ViewModel.正如我说我这样做,在过去的R&d和它的作品,但现在我看到我的视图的演变(验证,简单),我不能妥协,只是这个问题的缘故.

  2. 不要使用TryUpdateModel.可能,但那么我将如何合并这些变化呢?

  3. 从左到右使用.啊.但目前这似乎是我倾向的方式.

有人请给我解决方案#4!:)

顺便说一下,我正在使用ASP.NET MVC 3,Razor和Entity Framework.

小智 2

实际上,我在当前正在进行的项目中遇到了完全相同的问题。尽管我不喜欢它,但我最终还是采用了从左到右的方法,并将视图模型数据手动映射回我的实体。

这种方法唯一的好处是它确实给了你更多的控制权。自从我开始使用更多的复合视图模型以来,您的视图模型中实际上拥有来自多个实体的字段,因此以这种方式做事开始变得更有意义。

我也在使用 AutoMapper,你说得完全正确,当你尝试执行简单的更新操作时,它确实会变得很尴尬。希望我能为您提供一些超级聪明的解决方法,但“老式方法”似乎最适合我一直在做的工作。