[ASP.NET MVC] return View(model) 時,需要加上 ModelState.Clear();

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("欄位名稱"); 就行了。