iT邦幫忙

DAY 29
0

在錯誤中學習ASP.NET MVC系列 第 29

認識Model - ModelState

  • 分享至 

  • xImage
  •  

當驗證失敗時,上一次在表單內輸入的值還是會存在,不是在說廢話嗎,就都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_直接新增

再次瀏覽User/Create,完美!

好像還沒講到重點,寫程式當然不能只是不明究理的亂用,我們應該是探討究竟是什麼原因引起這種鬼打牆的狀況,明明Model Binding的值就已經透過程式修改了,但是到顯示的時候卻又顯示被程式修改前的狀態,其中原因當然跟ModelState脫不了關係,好!要來公布解答了!

答案就是ModelState的值有最高的顯示優先權,而透過ModelState.Clear()將值清空之後,自然就不會使用ModelState的值顯示了,改以第二順位的Action指定的Model值來做顯示

其實這情況不常遇到,不過除了我別人也有遇到過,所以我想這應該也算是個值得一提的觀念吧XD

下載今日專案:https://github.com/juben-wang/MvcApplication29


上一篇
認識Model - LINQ to Entities 與 導覽屬性
下一篇
認識View - DisplayTemplates與EditorTemplates補充
系列文
在錯誤中學習ASP.NET MVC30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言