有比較才會有收貨,有需求才會發現更多。
在傳統的WebFormk開發工作中,我們常常會存在如下的代碼塊
//保存 protected void btnSubmit_Click(object sender, EventArgs e) { try { BLL.MoneyBll cun = new BLL.MoneyBll(); Model.Money m1 = new Model.Money(); m1.Commany = int.Parse(this.Commany.Text); m1.CountryId = int.Parse(this.cou.Value); m1.CountryIds = ""; m1.MaxX = float.Parse(this.MaxX.Text); m1.MinX = float.Parse(this.MinX.Text); if (!string.IsNullOrEmpty(this.XPrice.Text)) { m1.XPrice = float.Parse(this.XPrice.Text); } if (!string.IsNullOrEmpty(this.YPrice.Text)) { m1.YPrice = float.Parse(this.YPrice.Text); } m1.Type = int.Parse(this.Type.Text); int res = cun.Add(m1); //JscriptMsg("添加費用信息成功!", "moneyList.aspx", "Success", "parent.loadMenuTree"); } catch { //JscriptMsg("添加費用信息失敗,請檢查錄入合法性!", "moneyList.aspx", "Error", "parent.loadMenuTree"); } }
即:在點擊保存按鈕的時候將表單Form內個表單元素的值一一獲取,轉換為相對應的目標類型,賦值到一個新的實體類對象屬性上,用於實現相關的功能點開發。
以上的代碼塊在我們日常的開發工作中頻頻出現,相似程度可謂高之又高。
在mvc中為該情況的通用帶來了優良的解決方案,——TryUpdateModel 用法如下
FunModel model = new FunModel(); TryUpdateModel(model, formCollection.AllKeys);
其中
formCollection.AllKeys是可選參數,如果未傳入該參數,TryUpdateModel會獲取當前請求上下文中所有的key值,包括Request.QueryString(eg:a.aspx?a=1&b=2)中的key值,以及Request.Form中所有的key值,還包括整個請求上下文中所有的數據包鍵值對中的健,
然后循環這些所有的健,通過反射機制獲取實體對象model對應key的屬性,判斷如果存在名稱為key的屬性,那么獲取數據包鍵值對中改key對應的value值,通過的反射的形式賦值到實體類的對應屬性中去,完成數據包內數據到實體對象的裝配,在此過程之中同樣存在數據包中的value值到實體對象屬性Type的類型轉換,省略了繁瑣的int.Parse(this.Commany.Text)判斷,轉型操作,大大簡化了功能開發中類似代碼的出現。formCollection.AllKeys————————Request.Form中所有的key值。
