我用ASP.NET MVC 5框架編寫了一個應用程序。我在視圖和ViewModels之間使用了雙向綁定。如何使用ASP.NET MVC手動將數據從ModelStateDictionary綁定到表示模型?
因爲我使用雙向綁定,所以我得到了很酷的客戶端和服務器端驗證的好處。但是,當我向服務器發送POST
請求並且請求處理程序拋出異常時,我想將用戶重定向到GET
方法。
當重定向發生時,我想保存模型狀態,以便在顯示錯誤時頁面看起來相同。我能夠使用ActionFilters
和TempData
via this approach來保存狀態模型和錯誤。但是,請求重定向時,從POST
到GET
模型狀態保存爲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");
}
}
「顯示」視圖期望'UserProfileDetailsPresenter'對象不是'DetailsPresenter'。不必在每個請求中創建UserProfileDetailsPresenter,而是重定向到Index索引,並讓它創建正確的對象並僅綁定數據。 – Jaylen
你最好打賭的是你在這兩個地方打了電話(在方法中已經有了它的榮譽)。無論如何,你將會每次創建'UserProfileDetailsPresenter'。這是在MVC中執行此操作的正確方法。您不想將不正確的,格式錯誤的甚至潛在危險的數據放入數據庫中。 – krillgar
所以在這種情況下,不需要ExportModelStateToTempData,對吧?擁有它有什麼好處? – Jaylen