可以通過基類實現的幾種功能。vs2008 .net 2.0
我很懶,很不喜歡寫重複的程式碼,一行重複的都不想寫,所以當同一段程式碼要寫第二遍的時候,我就會去想避免的方法。OO的特性之一 —— 繼承 —— 可以幫很大的忙。
這裡只說UI部分,先看一個類的圖。(我也不知道應該叫做什麼圖)
(TestList 、TestForm是網頁.aspx ,上面的都是類 .cs )
一般的軟體(比如OA、CRM等)都是需要先登入,需要有一定的許可權才能夠訪問,那麼每個頁面都需要驗證一下是否已經登陸了,或者登入是否超時,以及是否有訪問頁面的許可權,在具特點就是有沒有新增、修改、刪除,有沒有編輯某一條記錄的許可權,這些操作都是可以放在基類裡面的。
BasePagePower (.cs檔案) 繼承System.Web.UI.Page
驗證是否登入、登入是否超時,載入登陸人員的資訊(ID,姓名,部門等),生成資料訪問函式庫的例項,然後在OnUnload事件裡銷燬例項。這樣其他頁面只要繼承了這個類,就不用去想如何驗證登入資訊,如何獲取登入人的姓名這一類的事情了。至於資料訪問函式庫的例項嘛,估計這個會有很大的爭議,在這裡例項化的目的是,一個人、訪問一次頁面,只生成一個例項。這樣可以提高這個例項的利用率,因為我感覺資料訪問函式庫的“體積”有點大,生成一回,如果只做了一件事情(執行一個函式),那是不是太可惜了呢。另外在基類裡面例項化以後,在繼承的頁面裡呼叫的時候就和使用靜態函式很像了,也不用考慮什麼時候銷燬物件,因為這個也在基類裡面實現了。
BasePage (.cs檔案) 繼承 BasePagePower
在這裡主要是處理URL傳遞過來的模組ID,驗證一下這個引數是否正確(是不是數字),不是的話作出處理。還可以處理其它的引數,比如部門ID等,這個根據大家的情況靈活設定吧。在我的專案裡,大部分頁面都需要使用這個ID,可以用這個引數做很多的事情,比如驗證是否有訪問該頁面的許可權,載入控制元件的屬性等。
BasePageList (.cs檔案) 繼承BasePage
您可能會問了,有了上面的兩個類就已經夠用了,為什麼還有哇,上面那兩個也是應該合在一起的呀?因為我會在列表頁面使用幾個自己寫的控制元件:分頁控制元件、查詢控制元件、顯示資料的控制元件,對於這幾個控制元件的屬性設定可以放在這個基類裡面來處理,這樣表單頁面就可以簡單不少。
BasePageForm (.cs檔案) 繼承 BasePage
有了列表頁面的基類,對應的也要有表單頁面的基類,對!這個就是。在這裡要定義DataID和Kind。DataID是記錄從URL傳遞過來的記錄ID ,主要用來修改資料和顯示資料用;而Kind也是從URL傳遞過來的,表示要新增、修改還是顯示資料。當然在這裡不僅要接收,同時也要驗證一下引數是否正確,以避免注入攻擊。
控制元件的繼承。表單嘛,都會有一個“儲存”按鈕吧,如果想要在提交資料之前,先在IE裡做一下驗證的,我的做法是給按鈕加一個js的onclick 事件,而這個操作就很煩,每一個表單都要加一遍。現在可以在表單的基類裡面定義一個按鈕,然後在
OnInit 事件里加上這個js 事件就可以了。
public class BasePageForm : BasePage
{
public Button Btn_Save; //儲存按鈕
override protected void OnInit(EventArgs e)
{
base.OnInit(e);
Btn_Save.Attributes.Add("onclick", "return myCheck()");
Btn_Save.Text = "基類裡面設定Btn_Save";
}
}
這樣就可以了,表單頁面繼承之後,拖拽一個按鈕,ID設定成 Btn_Save 就 ok 了。
當然這裡只是舉一個例子,並不是說前臺驗證就一定要用這種方法,拋磚引玉吧。
基類都準備好了,下面就可以作業面了,根據不同的情況,繼承不同的基類,如果基類不夠的話,還可以根據情況來決定是否需要在增加。
下面是程式碼
public class BasePagePower : System.Web.UI.Page
{
/// <summary>
/// 在基類裡面定義資料訪問的例項,一個使用者,一次訪問,只使用一個例項
/// </summary>
public DataAccessHelp dal = new DataAccessHelp();
/// <summary>
/// 記錄登陸人員的資訊,您可以換成其他的方式來儲存
/// </summary>
public string[] EmpInfo;
#region 初始化 在Page_Load之間執行
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//驗證是否已經登陸
//如果已經登陸了,載入登陸人員的資訊,
//這裡使用陣列,您也可以使用其他的您習慣的方式。
EmpInfo = new string[];
EmpInfo[] = "" ;
//載入程式碼略
//清除IE快取
Response.Cache.SetNoStore();
}
#endregion
#region 銷燬資料訪問層的例項 。
override protected void OnUnload(EventArgs e)
{
if (dal != null)
dal.Dispose();
base.OnUnload(e);
}
#endregion
}
public class BasePage : BasePagePower
{
/// <summary>
/// 接收URL傳遞過來的模組ID,大部分頁面都需要使用這個ID
/// </summary>
public string FunctionID = "";
/// <summary>
/// 部門ID。不是所有的情況都會傳遞
/// </summary>
public string DepartmentID = "-3";
#region 初始化 在Page_Load之間執行
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.FunctionID = Request.QueryString["fid"];
#region 驗證模組引數是否是數字。
if (!Functions.IsInt(this.FunctionID))
{
Response.Write("模組引數不正確!");
Response.End();
}
#endregion
DepartmentID = Request.QueryString["did"];
if (!Functions.IsInt(DepartmentID))
{
//沒有傳遞,設定預設值
DepartmentID = "-3";
}
//驗證是否有許可權訪問該網頁
CheckPower();
}
#endregion
#region 驗證許可權 實現的程式碼
public void CheckPower()
{
//判斷是否有許可權訪問該網頁,驗證方法略
}
#endregion
}
public class BasePageList : BasePage
{
//相關的操作
}
public class BasePageForm : BasePage
{
/// <summary>
/// 接收URL傳遞過來的記錄ID,用於顯示、修改資料
/// </summary>
public string DataID;
/// <summary>
/// 接收URL傳遞過來的操作方式。
/// 1:新增、2:修改、3:顯示資料
/// </summary>
public string Kind;
public Button Btn_Save; //儲存按鈕
public Button Btn_Save2;
#region 初始化 在Page_Load之間執行
override protected void OnInit(EventArgs e)
{
base.OnInit(e);
this.DataID = Request.QueryString["id"]; //接收記錄ID
this.Kind = Request.QueryString["k"]; //接收操作方式
#region 驗證模組引數是否是數字。
if (!Functions.IsInt(this.DataID))
{
Response.Write("記錄ID不正確!");
Response.End();
}
#endregion
Btn_Save.Attributes.Add("onclick", "return myCheck()");
Btn_Save.Text = "基類裡面設定Btn_Save";
if (Btn_Save2 != null)
Btn_Save2.Text = "基類裡面設定Btn_Save2";
}
#endregion
}