2016-12-08 76 views
5

我用ASP.NET MVC 5框架編寫了一個應用程序。我在視圖和ViewModels之間使用了雙向綁定。如何使用ASP.NET MVC手動將數據從ModelStateDictionary綁定到表示模型?

因爲我使用雙向綁定,所以我得到了很酷的客戶端和服務器端驗證的好處。但是,當我向服務器發送POST請求並且請求處理程序拋出異常時,我想將用戶重定向到GET方法。

當重定向發生時,我想保存模型狀態,以便在顯示錯誤時頁面看起來相同。我能夠使用ActionFiltersTempDatavia this approach來保存狀態模型和錯誤。但是,請求重定向時,從POSTGET模型狀態保存爲System.Web.Mvc.ModelStateDictionary對象,該對象是包含來自POST請求的所有用戶輸入的鍵/值對。

爲了向最終用戶正確呈現頁面,我需要將System.Web.Mvc.ModelStateDictionary中的數據綁定到我自己的演示模型。

如何將System.Web.Mvc.ModelStateDictionary對象綁定到我的演示文稿對象?

這裏是我的代碼看起來像

[ImportModelStateFromTempData] 
public ActionResult show(int id) 
{ 

    var prsenter = new UserProfileDetailsPresenter(id); 

    ModelStateDictionary tmp = TempData["Support.ModelStateTempDataTransfer"]; 

    if(tmp != null) 
    { 
     // Some how map tmp to prsenter 
    } 

    return View(prsenter); 

} 

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 
    } finally 
    { 
     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
} 

回答

4

如果有一個錯誤,沒有自動跳轉,只返回查看。

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 

     // Return the named view directly, and pass in the model as it stands. 
     return View("Show", model); 
    } 
} 
+0

「顯示」視圖期望'UserProfileDetailsPresenter'對象不是'DetailsPresenter'。不必在每個請求中創建UserProfileDetailsPresenter,而是重定向到Index索引,並讓它創建正確的對象並僅綁定數據。 – Jaylen

+0

你最好打賭的是你在這兩個地方打了電話(在方法中已經有了它的榮譽)。無論如何,你將會每次創建'UserProfileDetailsPresenter'。這是在MVC中執行此操作的正確方法。您不想將不正確的,格式錯誤的甚至潛在危險的數據放入數據庫中。 – krillgar

+0

所以在這種情況下,不需要ExportModelStateToTempData,對吧?擁有它有什麼好處? – Jaylen