2011-05-26 40 views
3

如果我有通常的Edit操作,那麼GET操作可以讓GET通過它的ID檢索對象並將其顯示在編輯窗體中。 POST的下一個採用ViewModel中的值並更新數據庫中的對象。驗證錯誤後的RedirectToAction

public virtual ActionResult Edit(int id) 

[HttpPost] 
public ActionResult Edit(VehicleVariantEditSaveViewModel viewModel) 

如果在在POST操作模式結合發生錯誤時,我明白我可以RedirectToAction回GET行動,將其複製到TempData的,並在我們採取行動的重定向後取回保持的ModelState驗證錯誤。

if (TempData["ViewData"] != null) 
{ 
    ViewData = (ViewDataDictionary)TempData["ViewData"]; 
} 

我怎麼然後再轉換ViewData的,包括以前的無效的ModelState,進入一個新的模式,使用戶可以看到他們的無效輸入與驗證警告發送到視圖?奇怪的是,如果我將從數據庫中檢索到的ViewModel的新實例(包含原始有效數據)傳遞給View(),則會忽略此視圖並顯示ViewData中的(無效)數據!

感謝

回答

3

我有一個類似的問題,並決定採用以下模式:

public ActionResult PersonalRecord(Guid id) 
{ 
    if (TempData["Model"] == null) 
    { 
     var personalRecord = _context.PersonalRecords.Single(p => p.UserId == id); 
     var model = personalRecord.ToPersonalRecordModel(); 
     return View(model); 
    } 
    else 
    { 
     ViewData = (ViewDataDictionary) TempData["ViewData"]; 
     return View(TempData["Model"]); 
    } 
} 

[HttpPost] 
public ActionResult PersonalRecord(PersonalRecordModel model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var personalRecord = _context.PersonalRecords.Single(u => u.UserId == model.UserId); 
      personalRecord.Email = model.Email; 
      personalRecord.DOB = model.DOB; 
      personalRecord.PrimaryPhone = model.PrimaryPhone; 
      _context.Update(personalRecord); 
      _context.SaveChanges(); 
      return RedirectToAction("PersonalRecord"); 
     } 
    } 
    catch (DbEntityValidationException ex) 
    { 
     var errors = ex.EntityValidationErrors.First(); 
     foreach (var propertyError in errors.ValidationErrors) 
     { 
      ModelState.AddModelError(propertyError.PropertyName, propertyError.ErrorMessage); 
     } 
    } 

    TempData["Model"] = model; 
    TempData["ViewData"] = ViewData; 

    return RedirectToAction("PersonalRecord", new { id = model.UserId }); 
} 

希望這有助於。

1

我注意到Model包含在ViewData中,所以除了ViewData之外您不需要傳遞它,我不瞭解的是如何讓它返回到視圖。

public ViewResult Edit(int id) 
    { 
     // Check if we have ViewData in the session from a previous attempt which failed validation 
     if (TempData["ViewData"] != null) 
     { 
      ViewData = (ViewDataDictionary)TempData["ViewData"]; 
     } 

     VehicleVariantEditViewModel viewModel = new VehicleVariantControllerViewModelBuilder() 
      .BuildForEdit(id); 

     return View(viewModel);  
    } 

但顯然它使數據庫以建立一個新的型號不必要的調用(獲取傳遞的ViewData與無效值自動地覆蓋從Model)

混淆上述作品。

+0

這個簡單的解決方案幫了我很多。謝謝! – jforberg 2014-06-24 08:03:20