使用反射將業(yè)務(wù)對(duì)象綁定到 ASP.NET 窗體控件
2006/12/23 17:30:16
引言
在 Web 開(kāi)發(fā)人員的最常見(jiàn)任務(wù)之中,有一項(xiàng)任務(wù)是他們要反復(fù)執(zhí)行的:建立更新數(shù)據(jù)庫(kù)表的簡(jiǎn)單窗體。我們將創(chuàng)建一個(gè)列表頁(yè)面和一個(gè)窗體頁(yè)面,列表頁(yè)面中以表格形式顯示記錄,窗體頁(yè)面中帶有用于各個(gè)數(shù)據(jù)庫(kù)字段的適當(dāng)?shù)拇绑w控件。許多開(kāi)發(fā)人員還使用表示數(shù)據(jù)庫(kù)表的業(yè)務(wù)對(duì)象將代碼組織到分為多層的設(shè)計(jì)中。如果以業(yè)務(wù)對(duì)象 (Document) 來(lái)表示數(shù)據(jù)庫(kù)表 (Documents),許多窗體的代碼看上去將如下所示:
<script runat="server"> protected void Page_Load(Object Src, EventArgs E) { if (!IsPostBack) {    Document document =          Documents.GetDocument(Request.QueryString["DocumentID"]);    Title.Text = document.Title;    Active.Checked = document.Active;    CreatedDate.Text = document.CreatedDate.ToString();    AuthorID.FindByValue(document.AuthorID.ToString()).Selected =          true;    // ... 等等    HtmlBody.Text = document.HtmlBody; } } protected void SaveButton_Click(Object Src, EventArgs E) {    Document document =          Documents.GetDocument(Request.QueryString["DocumentID"]);    document.Title = Title.Text;    document.Active = Active.Checked;    document.CreatedDate = Convert.ToDateTime(CreatedDate.Text);    document.AuthorID = Convert.ToInt32(AuthorID.SelectedItem.Value);    // ... 等等    document.HtmlBody = HtmlBody.Text;    Documents.Update(document); } </script>  簡(jiǎn)化和縮短窗體代碼
在以上代碼中,對(duì)每個(gè)控件進(jìn)行顯式轉(zhuǎn)換,并將其設(shè)置為窗體控件的正確屬性。根據(jù)屬性和窗體控件的數(shù)量,這部分代碼可能會(huì)變長(zhǎng)并難以管理。代碼還應(yīng)包含類(lèi)型轉(zhuǎn)換的錯(cuò)誤更正和 ListControl,這將進(jìn)一步增加復(fù)雜性。即使窗體是由代碼生成工具(例如 Eric J. Smith 的優(yōu)秀的 CodeSmith)生成的,當(dāng)需要任何自定義邏輯關(guān)系時(shí),很容易引入錯(cuò)誤。
使用反射,可以?xún)H使用單行代碼便將業(yè)務(wù)對(duì)象的所有屬性綁定到相應(yīng)的窗體控件,從而減少代碼的行數(shù)并增強(qiáng)可讀性。完成反射系統(tǒng)的建立后,以上代碼將簡(jiǎn)化為:
protected void Page_Load(Object Src, EventArgs E) {    if (!IsPostBack) {      Document document =      Documents.GetDocument(Request.QueryString["DocumentID"]);        FormBinding.BindObjectToControls(document);    } } protected void Save_Click(Object Src, EventArgs E) {    Document document =          Documents.GetDocument(Request.QueryString["DocumentID"]);    FormBinding.BindControlsToObject(document);    Documents.Update(document); } 
此代碼可用于所有標(biāo)準(zhǔn)的 ASP.NET 控件(TextBox、DropDownList、CheckBox 等)和許多第三方控件(例如 Free TextBox 和 Calendar Popup)。無(wú)論有多少業(yè)務(wù)對(duì)象屬性和窗體控件,這一行代碼都能提供所需的全部功能,只要窗體控件的 ID 與業(yè)務(wù)對(duì)象屬性名相匹配。 開(kāi)始:從反射中檢索屬性列表
首先,我們需要檢查業(yè)務(wù)對(duì)象的屬性,并查找與業(yè)務(wù)對(duì)象屬性名具有相同 ID 的 ASP.NET 控件。以下代碼構(gòu)成了綁定查找的基礎(chǔ):
public class FormBinding {    public static void BindObjectToControls(object obj,          Control container) {      if (obj == null) return;      Type objType = obj.GetType();      PropertyInfo[] objPropertiesArray =                objType.GetProperties();        foreach (PropertyInfo objProperty in objPropertiesArray) {          Control control =                      container.FindControl(objPro

下一頁(yè)
返回列表
返回首頁(yè) 主站蜘蛛池模板: 妖精动漫在线观看| 欧美成a人片在线观看久| 国产在线精品一区二区在线看| 亚洲国产精品无码久久久| 精品少妇一区二区三区视频| 国产又色又爽又黄刺激在线视频 | 欧美国产亚洲精品高清不卡| 国产亚洲欧美在线播放网站| 69堂在线观看| 国产边摸边吃奶叫床视频| jux-222椎名由奈在线观看| 无套内射在线无码播放| 久久精品日日躁夜夜躁欧美| 欧美性大战久久久久久| 亚洲精品自产拍在线观看动漫| 精品国产一区二区三区久久影院| 国产乱码1卡二卡3卡四卡| 又大又粗又长视频| 又大又硬又爽又粗又快的视频免费| 天天射天天操天天| 一本到视频在线| 成年在线观看免费人视频草莓| 久久久精品人妻一区亚美研究所| 最近中文国语字幕在线播放 | www成人在线观看| 我和室友香蕉第二部分| 久久久久人妻精品一区三寸蜜桃| 最新版天堂中文在线| 亚洲午夜成激人情在线影院| 欧美日韩精彩视频| 亚洲精品无码不卡在线播放| 狠狠色婷婷久久一区二区三区| 免费观看四虎精品国产永久| 久草视频在线网| 国产精品久久久久久搜索| 91久久偷偷做嫩草影院免| 在公车上拨开内裤进入毛片| AV无码免费一区二区三区| 天天做天天摸天天爽天天爱| www.av在线| 好吊妞998视频免费观看在线|