2026年3月18日 星期三

讓 ModelState.IsValid 重新發揮作用

幾年前寫了篇文章,說明當 ModelState.IsValid 無法發揮作用的替代方案,最近又遇上類似的專案,

這次突然有想法想再試試看,是否真的能讓 ModelState.IsValid 再次作用



先回顧下為何 ModelState.IsValid 會無法作動


由於雙方約定呼叫API時,傳遞的參數需要加密,接收端收到之後會解密,將資料轉成

對應的 Request ,但因為解密的動作是透過 ActionFilter 來實作,故原始資料就會被異動,

故 ModelState.IsValid 的判斷都會回傳 false,就不會是我們預期要的效果


這次發想的脈絡,若因為異動的原始資料而讓 ModelState.IsValid 失效,那就再次綁定應該就可以


首先設定一個 Action 來模擬內容為若 ModelState.IsValid 驗證成功,就回傳 Ok,若驗證

失敗就回傳 BadRequest


方法傳入一個 Person 物件上方掛了一個 Attribute,Person 類別如下,相關欄位為必填


ApiRequestParserAttribute 類別如下,繼承了 ActionFilterAttribute,先註解

RebindingModelState() 方法




內容為取得 Request 原始資料,並且將資料塞給下一步的Action


呼叫端是使用 Json 格式,內容有個 Data 屬性,相關欄位都有值


但送出後,發現其實 ModelState 是沒有過的


此時把 RebindingModelState() 方法打開



再重新執行一次


結論:關鍵就在重新綁定的部分


最後附上GetRequestRaw()



沒有留言:

張貼留言