當驗證失敗時,上一次在表單內輸入的值還是會存在,不是在說廢話嗎,就都Model Binding了,值當然會在XD
觀察UserController內的Create Action當使用者送出表單後,我們可以看到已經綁定到User這個物件上了
並且可以透過ModelState.IsValid來判斷是驗證成功,如果新增成功就導回清單頁,否則就顯示原頁面,透過中斷點來觀察ModelState的資料,發現裡面也會保存表單的輸入資訊
如果今天想在使用者輸入非A開頭的帳號時,直接幫他加上A_這個字串讓他可以直接新增的話要怎麼做呢,例如下圖,讓使用者輸入Bob按下Create按鈕時,停留在原畫面並將Bob改為A_Bob
這功能還不簡單嘛!阿不就驗證失敗的時候加工一下Name的值就好了
很抱歉!改了竟然沒用!!!不是應該顯示A_Bob嗎?此時你就算檢查一百萬遍確定你真的有重新設定user.Name的值也沒用,用中斷點看一千萬次也一樣,明明就已經改成A_Bob了,但顯示的時候還是很固執的顯示Bob
當初我遇到這個問題時都沒辦法解決,問人也問不出所以然,直到幾個月過去之後,同事竟然找到解法了!使用ModelState.Clear(),當時也沒想太多!用就對了XD
喔耶!終於可以正常顯示了!但是我的錯誤訊息勒?一樣被Clear清掉了XD
所以必須自己手動加回去,提示使用者可以自行修改或是使用程式自動產生的A_直接新增
好像還沒講到重點,寫程式當然不能只是不明究理的亂用,我們應該是探討究竟是什麼原因引起這種鬼打牆的狀況,明明Model Binding的值就已經透過程式修改了,但是到顯示的時候卻又顯示被程式修改前的狀態,其中原因當然跟ModelState脫不了關係,好!要來公布解答了!
答案就是ModelState的值有最高的顯示優先權,而透過ModelState.Clear()將值清空之後,自然就不會使用ModelState的值顯示了,改以第二順位的Action指定的Model值來做顯示
其實這情況不常遇到,不過除了我別人也有遇到過,所以我想這應該也算是個值得一提的觀念吧XD
下載今日專案:https://github.com/juben-wang/MvcApplication29