這個問題最好用代碼解釋:的ModelState,TempData的,視圖模型的問題 - 新的視圖模型值會自動被覆蓋
public async Task<ActionResult> Index()
{
if (TempData.ContainsKey("ModelState"))
{
ModelState.Merge((ModelStateDictionary)TempData["ModelState"]);
var viewModelA= new ViewModelA
{
FirstName = "John"
}
return View(viewModelA);
}
}
[HttpPost]
public async Task<ActionResult> IndexPostActionMethod(ViewModelB model)
{
if (ModelState.IsValid)
{
var result = await DoSomeStuff();
if (result.Succeeded)
{
DoSomeOtherStuff();
}
else
{
AddErrors(result);
}
}
TempData["ModelState"] = ModelState;
return RedirectToAction("Index");
}
這裏的問題是,當我發佈到IndexPostActionMethod
和DoSomeStuff()
回報false
出於某種原因,該通過重定向到Index
並在重定向期間將ModelState
保存在TempData
中,然後在重新顯示錶單/頁時,從ModelState
(或從何處獲取值的位置)的值被設置爲@Html.TextBoxFor(m => m.FirstName)
而不是我在這裏設置的值:var viewModelA = new ViewModelA { FirstName = "John"}
。爲什麼我不能重寫該值,它從哪裏得到?這就像框架自動更新viewModelA
與ModelStatDictionary
事件中的任何事件,儘管我創建了一個具有新值的新的ViewModelA
。
構建一個複雜的購物車頁面,單頁面應用類型的應用程序,具有GET操作的大視圖模型和5個用於POST操作的較小視圖模型。哪些POST操作被調用取決於用戶輸入。需要保留路由/ url,並在後續頁面視圖中使用內置驗證狀態,這就是爲什麼我要將ModelState從一個actionmethod傳遞到另一個actionmethod的原因。 – PussInBoots
可能可能會創建一個新問題,但因爲您似乎對這些類型的場景有很多瞭解。如果您的GET操作具有較大的視圖模型,並且您只想將您的值的子集傳遞給與GET操作具有相同名稱的POST操作,並將視圖模型作爲參數傳遞,並且ModelState.IsValid需要評估爲true ;你會怎麼做呢? – PussInBoots
使用標籤jquery插件btw所以一些值將在POST上爲空,因此ModelState.IsValid將評估爲false,這不是我想要的,因爲這些文本框對用戶是隱藏的。 – PussInBoots