return View(model) 時,需要加上 ModelState.Clear();
這幾天看到有人在問,
他按下 submit 後,在 controller 修改了 model 的值,return view 後,網頁上的 textbox 的值卻不會改變。
一個簡單的例子
View:
Model:
{
[Required]
public int age { get; set; }
}
Controller:
{
UserModel newUser = new UserModel();
return View(newUser);
}
[HttpPost]
public ActionResult UserRegistration(UserModel newUser)
{
try
{
if (newUser.age <= 0)
{
newUser.age = 1;
}
if (newUser.age <= 1)
{
// 我們在這裡丟出一個錯誤來測試。
throw new Exception("Error");
}
return RedirectToAction("Index");
}
catch (Exception ex)
{
return View(newUser);
}
}
以這個例子來講,因為在中間丟出了一個錯誤,所以會跑到 catch ,而 return View 後,我們預期的結果是 1。
但是執行之後會發現,textbox的值卻還是 0。
而這是因為 ModelState 的值沒有更新,裡面的值還是 0 的關係。
但我們是沒辦法修改它裡面的值的,所以我們必須清除它裡面舊有的值。
要清除很簡單,只要一行 ModelState.Clear(); 但這是全部清除,
如果不想全部清除,就用 ModelState.Remove("欄位名稱"); 就行了。