熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Asp.net中基類頁的設計和使用

2013-11-13 10:09:41  來源: .NET編程 

  在業務系統的開發過程中為了保證頁面風格的一致性以及減少重復代碼的編寫我們需要引入基類頁的概念定義一個基類頁讓所有 的頁面都繼承這個基類並在該基類頁中加入公用的屬性和方法

  實際使用時按照功能頁面劃分可以定義多個基類頁

  class FormBase

  class BizFormBase   FormBase

  class ViewFormBase  : BizFormBase

  class EditFormBase  : BizFormBase

  class QueryFormBase : FormBase

  FormBase基類頁中的根提供與業務無關的服務URL重寫日志等

  BizFormBase加入和業務相關的屬性該 頁面的當前業務對象ID等

  ViewFormBaseEditFormBase實現具體的查看編輯功能

  QueryFormBase 實現對通用查詢頁面的封裝

  從面向對象的角度看基類頁與普通的基類繼承類設計其實區別並不大都要在基類中編寫公用的屬性方法並通過虛函數事件等方式讓繼承類重寫或響 應所不同的是基類頁的設計過程受到所在環境的約束在WinForm環境下我們可以預先定義好窗體的公用元素如工具條默認的表格以及 DataSource控件等而到了下的WebForm則無法實現界面一級的繼承同時加入了狀態管理等要求

  為了幫助大家理解我們以查詢基類頁的設計過程來分析

  一個最簡單的查詢頁面會包括三部分多個查詢條件文本框查詢按鈕以及表格同時查詢頁會和一個數據訪問組件關聯當點查詢時會把查詢條件轉成 where語句提交給數據訪問組件

  QueryPeopleForm

  OnQueryButtonClick()

  {

  string peopleName = txtPeopleNameText;

  string peopleAge  = txtPeopleAgeText;

  string sql;

  sql = stringFormat(Name Like%{}%and Age = {} PeopleName peopleAge);

  PeopleManager manager = new PeopleManager();

  thisgridMainDataSource = managerGetDataTable(sql);

  thisgridMainDataBind();

  }

  當點擊查詢按鈕時我們做了以下三件事

   獲取查詢條件

   提交查詢

   將查詢結果綁定到表格

  這兒的提交查詢和綁定在不同的查詢頁面都是一樣的於是我們首先把放到基類頁中並提供這樣一個方法void QueryAndBind(IManager manager string sql);這兒要定義IManager接口讓所有的Manager都實現該接口這樣基類頁就無需知道具體的Manager只要調用 IManagerGetDataTable方法然後綁定表格到即可

  使用基類頁後的代碼

  QueryPeopleForm : QueryFormBase

  OnQueryButtonClick()

  {

  string peopleName = txtPeopleNameText;

  string peopleAge = txtPeopleAgeText;

  sql = stringFormat(Name Like%{}%and Age = {} PeopleName peopleAge);

  QueryAndBind(new PeopleManager() sql);

  }

  這兒的代碼少了但仍有問題當查詢條件變化後每次拼查詢語句的工作即枯燥又容易出錯那麼我們加入一個Query類以簡化這兒的操作:

  public enum QueryOperator

  {

  //等於比較

  Equal =

  // 不等於

  NotEqual =

  // Like比較

  Like =

  }

  class Query

  {

  void Add(string fieldName string value QueryOperator oper);

  string GetSql();

  }

  QueryPeopleForm : QueryFormBase

  OnQueryButtonClick()

  {

  Query query = new Query();

  queryAdd(Name txtPeopleNameText QueryOperatorLike);

  queryAdd(Age txtPeopleAgeText QueryOperatorEqual);

  QueryAndBind(new PeopleManager() queryGetSql());

  }

  把拼Sql的工作放在Query類中做調用者只要聲明查詢字段對應的值和比較類型即可

  到這一步我們的基類頁已經很好用了但還有一個小問題也就是前面說的在WebForm中無法實現界面級的繼承那麼基類頁的 QueryAndBind方法將無法知道查詢結果要綁定到哪一個表格這時我們的做法是在基類頁中聲明DefaultGrid屬性讓繼承頁來告知當前 的表格控件

  修改後的代碼

  QueryPeopleForm : QueryFormBase

  OnQueryButtonClick()

  {

  InitControls(gridMain);

  Query query = new Query();

  queryAdd(Name txtPeopleNameText QueryOperatorLike);

  queryAdd(Age txtPeopleAgeText QueryOperatorEqual);

  QueryAndBind(new PeopleManager() queryGetSql());

  }

  至此基類頁的功能已經完整了但仍然不夠如果我們以後想改變查詢按鈕點擊的行為比如查詢結果為空時要彈出對話框提示這時仍然要到處修改頁 面代碼這不是我們所希望的於是我們將QueryButton的OnClick操作也放在基類頁了中執行繼承頁只要初始化數據訪問組件和設置查詢條件 即可

  QueryPeopleForm : QueryFormBase

  void Initialize()

  {

  // 指定頁面對應的Manager

  Manager = new PeopleManager();

  // 綁定控件

  InitControls(gridMain btnQuery);

  }

  void GetQueryInfo(Query query)

  {

  //獲得查詢條件

  queryAdd(Name txtPeopleNameText QueryOperatorLike);

  queryAdd(Age txtPeopleAgeText QueryOperatorEqual);

  }

  QueryFormBase:

  private IManager manager = null;

  public IManager Manager

  {

  get { return manager; }

  set { manager = value; }

  }

  void InitControls(GridView grid Button queryButton)

  {

  thisdefaultGrid = grid;

  thisqueryButton = queryButton;

  queryButtonClick += new EventHandler(QueryButton_Click);

  }

  void QueryButton_Click(object sender EventArgs e)

  {

  Query query = new Query();

  GetQueryInfo(Query);

  QueryAndBind(manager queryGetSql());

  }

  總的代碼可以從附件中下載大家可以加入斷點看看基類繼承類頁的代碼執行順序

  應該說基類的設計相對復雜但好處是繼承頁的代碼變得清 楚了沒有多余重復的代碼

  而基類頁的設計其實是有技巧的總結起來有以下幾條

   首先以最直接的方式寫出頁面代碼

   提取公用方法和添加輔助類

   提取事件處理流程到基類頁中

   在基類頁中設計需要繼承頁重載的方法與事件

  從設計上來講用基類頁的方式來統一操作簡化頁面代碼是一種非常直觀的方式缺點是隨著項目的演化基類頁會變得大而全不容易被新的項目重用 這時我們就可以考慮把其中的一部分功能放到用戶控件和自定義組件中來實現以減少耦合性和提高重用性


From:http://tw.wingwit.com/Article/program/net/201311/12754.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.