1. 程式人生 > 其它 >可以通過基類實現的幾種功能。vs2008 .net 2.0

可以通過基類實現的幾種功能。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



        

    }