ASP.NET Web開發(fā)框架之七 開發(fā)流程與模式
經(jīng)過前面六篇文章的講解,基本的理論已經(jīng)介紹完畢,這一篇進行實戰(zhàn)練習(xí),討論如何從頭開始開發(fā)一個完整的ASP.NET 頁面,并進行數(shù)據(jù)讀寫,業(yè)務(wù)邏輯設(shè)定。
1 設(shè)計數(shù)據(jù)庫表 Table Design
公司表存放系統(tǒng)中的公司實例,表示進行業(yè)務(wù)往來的實體,它的表結(jié)構(gòu)如下腳本所示
- CREATE TABLE [dbo].[Company](
- [CompID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
- [ParentCompID] [numeric](18, 0) NULL,
- [CompTypeID] [numeric](18, 0) NOT NULL,
- [CompNO] [varchar](20) NOT NULL,
- [CompName] [varchar](50) NOT NULL,
- [Corporation] [varchar](20) NULL,
- [CorpMobile] [varchar](20) NULL,
- [CorpTel] [varchar](20) NULL,
- [Address] [varchar](100) NULL,
- [Tel1] [varchar](20) NULL,
- [Tel2] [varchar](20) NULL,
- [Fax] [varchar](20) NULL,
- CONSTRAINT [PK_TCOMPANY] PRIMARY KEY CLUSTERED
- (
- [CompID] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY]
2 實體映射 ORM Mapping
打開LLBL Gen,連接到數(shù)據(jù)庫并更新實體,把上面的Company表映射到實體CompanyEntity。設(shè)計字段名時,最好以簡明,可讀性好的詞命名,這樣可以增強映射到實體上的屬性的可讀性。
如果表與表之前有關(guān)聯(lián),LLBL Gen會自動生成表之間的關(guān)聯(lián)。
3 數(shù)據(jù)讀寫接口與實現(xiàn)的產(chǎn)生 Interface and Service Implementation
這一步驟也是自動化的,不需要額外的腦力活動。以Code Smith打開模板Interface.cst和Manager.cst,選擇表對象為Company,生成代碼,把這此代碼拷貝到Visual Studio的項目中即可。
請在項目的Source\Maintenance\Template路徑下獲取上面所提到的兩個模板,用以生成數(shù)據(jù)讀寫接口與實現(xiàn)代碼。
4 ASP.NET 頁面布局與編程 ASP.NET Page Layout Design and Coding
向Web項目中添加一個ASP.NET 頁面,命名為company.aspx。我推薦以小寫命名Web項目的文件夾,文件名和頁面類型名稱。為了讓它具備EntryPageBase的功能,我在頁面的首部,添加一個Toolbar,它用來承載工具箱中的系列工具,以進行數(shù)據(jù)的前后瀏覽,增加刪除工作。其它的地方,以FormRow的方式安排布局。
FormRow會為它的Items平均分配寬度,所以每行FormRow最好放置相同的Items以讓界面布局看起來美觀整齊。
ASP.NET的后臺代碼看起來是這樣的,這里羅列所有的代碼,供您參考。
- [Function("AIITHD", "~/module/company.aspx")]
- public partial class company : EntryPageBase
- {
- protected override void PageLoadEvent(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- TransactionType = EntityType.CompanyEntity;
- ddlCompanyGroup.InitializeValueListFromEnum(9);
- }
- base.PageLoadEvent(sender, e);
- }
- public override EntityBase2 LoadEntity(string refNo)
- {
- ICompanyManager manager = ClientProxyFactory.CreateProxyInstance<ICompanyManager>();
- CompanyEntity customer = manager.GetCompany(Convert.ToInt16(refNo));
- return customer;
- }
- public override void DeleteEntity(EntityBase2 entity)
- {
- CompanyEntity user = (CompanyEntity)entity;
- ICompanyManager manager = ClientProxyFactory.CreateProxyInstance<ICompanyManager>();
- manager.DeleteCompany(user);
- }
- public override void SaveEntity(EntityBase2 entity)
- {
- CompanyEntity user = (CompanyEntity)entity;
- ICompanyManager manager = ClientProxyFactory.CreateProxyInstance<ICompanyManager>();
- manager.SaveCompany(user);
- }
- }
首先給頁面分配一個功能編碼,比如此頁面的AIITHD,然后設(shè)定的Url屬性,這兩個同時附加到頁面的特性中去。
- [Function("AIITHD", "~/module/company.aspx")]
這里有些不足之處,到目前為止我還沒有找到根據(jù)ASP.NET頁面類型,得到它的頁面文件。因為ASP.NET的請求處理是以ASPX文件在瀏覽器中敲入后,發(fā)送到服務(wù)器來執(zhí)行的。所以,如果能找到這個辦法,則這里的Url設(shè)定可以省略。
其次,指定TransactionType = EntityType.CompanyEntity,這用來指定當(dāng)前頁面的實體為CompanyEntity,并對它進行讀寫操作,與頁面相關(guān)的數(shù)據(jù)綁定,回寫到數(shù)據(jù)庫中,均需要此屬性。緊接著的是三個模板方法,LoadEntity用于加載公司實體,DeleteEntity用于刪除,SaveEntity用于保存修改后的實體。這三個方法均是override,它被頁面基類調(diào)用。
最后執(zhí)行一下功能編碼為AIITHD的功能,來看看效果是怎樣的。在頁面的右上角輸入功能編碼,點擊Go按鈕。
關(guān)于數(shù)據(jù)綁定,所有的秘密藏在頁面文件中,我以Company No為例子,請看它的頁面文件
- <ext:TextBox ID="tbxName" runat="server" Label="Company No" DataBindingString="CompanyEntity:CompNo">
- </ext:TextBox>
它的DataBindingString屬性,在讀取數(shù)據(jù)時,將實體屬性綁定到此控件,在保存時,又讀取這個值,回寫到實體中并保存到數(shù)據(jù)庫中,這樣可以減少大量重復(fù)的代碼。
原文鏈接:http://www.cnblogs.com/JamesLi2015/archive/2012/10/08/2714794.html
【編輯推薦】