使用反射將業(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视频免费观看在线|