ModelStateValue 常遇到的同名衝突

ASP.NET MVC Model Binder 在 mvc 中處理掉所有 Client Side 跟 Server Side 的對應,處理掉很多繁瑣的小細節,寫起來變得非常的直覺。但是就是因為太直覺了,讓人往往忘記它的存在,Model Binder 發生的問題也是非常容易鬼打牆的地方。遇到這種問題我之前也是非常相信直覺的判斷,但是事實證明不能太鐵齒,遇到問題還是趕快把 .pdb 加進來一起偵錯吧
我個人很喜歡在 View 裡面用強型別 Model 配合 HTml.Helper 來做輸出的動作,不過有時候會遇到 Helper 輸出結果跟預設的想像不同的狀況。預設的想法就是 Helper 應該會輸出 Model 當下狀態的結果,不過反覆檢查下才知道 Helper 動作並不是如此。

ModelStateValue 的同名衝突

Html.Helper 在強型別配合下並不是直接輸出 Model 裡面的值,他一樣會同時參考其他資料來源,所以當使用 HtmlHelper 的時候,會容易因為呼叫的方式而預想成是直接根據強型別 Model 來作輸出。

Binding 進 ModelStateValue 裡面的資料

ModelState 在外部存取的時候是 readOnly 所以沒有辦法直接加入值,最常遇到的狀況就是在 get 或 post 的 Data 資料被 binding 進去 ModelStateValue 裡面,為了重現這個狀況
首先我建立一個當作強型別的 Model

public class HomeIndexModel{
public string Phone { get; set; }
}
相關的 Controller
public ActionResult Index(HomeIndexModel model)
{
model.Phone = "0";
return View(model);
}
View
@model ModelStateValue.Models.HomeIndexModel<section class="features">
@using (Html.BeginForm())
{
@Html.TextBoxFor(it => it.Phone)
<input type="submit" value="submit" />
}
</section>

首先在一開始進入頁面的時候,helper 顯示出來是 controller 設定的 0。

image

之後輸入其他值並且 Submit 回 Server Side。

image

Model 的值也確實被改變了。

image

但是之後回傳頁面卻還是 Post 回傳的值。

image

這個問題當初確實困擾我一陣子,當然有很多方法可以避免,但是跟我原本對 MVC 的想法有一些衝突,其實也就是對整個 Framework 不夠熟悉才會這樣。雖然已經被設置為強型別的 View ,但是 Html Helper 的資料來源並不是強型別 Model 而是 ModelState

image

而因為 Post 回 Server 的時候 PostData 已經綁定進入 ModelState 所以在輸出的時候抓到的並不是強型別 Model 的值,而是一開始被 binding 的部分。


http://stackoverflow.com/questions/9529730/view-does-not-affect-models-changes

ASP.NET MVC 開發心得分享 (6):小心使用 FormCollection

ASP.NET MVC 開發心得分享 (4):微調 Model Binder 屬性

ASP.NET MVC 開發心得分享 (12):Model Binder 的陷阱

One thought on “ModelStateValue 常遇到的同名衝突

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *