Asp.net-Mvc

綁定到 ViewModel 時如何更新模型?

  • April 18, 2016

我有一個這樣的[HttpPost]動作方法簽名:

[HttpPost]
public ActionResult Edit(ExistingPostViewModel model)
{
  // Save the edited Post.
}

現在,在過去(當我不使用 ViewModel,例如 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);
}

效果很好。

但我很困惑如何使上述內容適應 ViewModel 方法。

如果我這樣做:

TryUpdateModel(existingPost)

使用我的 ViewModel 方法,不會發生太多事情。沒有錯誤,但沒有更新,因為 MVC 不知道如何Post從 a 更新 a ExistingPostViewModel(之前是Post-> Post)。

現在,我正在使用 AutoMapper。所以我想我可以從 ViewModel 映射到Post,然後保存文章。

但後來我基本上壓倒了一切。我不想這樣做並且破壞了削減 ViewModel 的要點。

誰能解惑我?

這似乎是一個非常常見的場景,我完全不知道人們如何解決這個問題。我只能看到 3 種可能的解決方案:

  1. 不要在 HTTP POST 中使用 ViewModel。正如我所說,我過去是為研發而這樣做的,它確實有效,但現在我看到了我的視圖是如何演變的(驗證、簡單),我不能僅僅為了這個問題而妥協。
  2. 不要使用 TryUpdateModel。可能,但是我將如何合併更改?
  3. 使用從左到右。啊。但目前這似乎是我傾向於的方式。

有人請給我解決方案#4!:)

順便說一句,我正在使用 ASP.NET MVC 3、Razor 和實體框架。

我實際上在我目前正在從事的項目中遇到了同樣的問題。儘管我不喜歡它,但我最終還是採用了從左到右的方法並將我的視圖模型數據手動映射回我的實體。

這種方法唯一的好處是它確實給了你更多的控制權。由於我開始使用更多的複合視圖模型,實際上您的視圖模型中包含來自多個實體的欄位,因此以這種方式做事開始變得更有意義。

我也在使用 AutoMapper,你是絕對正確的,當你試圖做一個簡單的更新操作時,它確實會變得很尷尬。希望我為您提供一些超級聰明的解決方法,但是“老式方式”似乎最適合我一直在做的工作。

引用自:https://stackoverflow.com/questions/5892888