程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 擴展方法 之 Asp.Net篇

擴展方法 之 Asp.Net篇

編輯:.NET實例教程


說起擴展方法,不得不提博客園的鶴沖天,其關於擴展方法的文章基本上占了總文章的一半,其中不乏優秀之作。

  我在ASP.Net開發期間也總結了不少擴展方法,與大家分享一下。

  1. 獲取GridVIEw的主鍵值:

         public static T GetKey<T>(this GridVIEw grid, int rowIndex)
          {  
             T key = (T)grid.DataKeys[rowIndex].Value;
             return key;
         }

  示例:

         protected void gvMaster_RowEditing(object sender, GridVIEwEditEventArgs e)
          {
             string key = gvMaster.GetKey<string>(e.NewEditIndex);
              
         }

  2. 獲取GridVIEw的行號:

         public static int GetRowIndex(this GridVIEwCommandEventArgs e)
          {
             GridViewRow gvrow = (GridVIEwRow)(((Control)e.CommandSource).NamingContainer);
             return gvrow.RowIndex;
         }

  示例:

       protected  void gvMaster_RowCommand(object sender, GridVIEwCommandEventArgs e)
          {
             int rowIndex = e.GetRowIndex();
              
         }

3. 查找指定ID的控件,並轉換成指定類型:

         public static T FindControl<T>(this Control control, string id) where T : class
          {
             Control c = control.FindControl(id);
             return  (c as T);
         }

  示例:

 //從整個頁面裡查找ID為lblTest的Label
this.FindControl<Label>("lblTest");
//從Panel裡查找ID為lblTest的Label
Panel1.FindControl<Label>("lblTest");

  4. 查找指定類型的控件:

        public static List<T> FindControls<T>(this Control control) where T : Control
          {
             Action<Control, List<T>> findhelper =null;
              findhelper= (ctl, list) =>
              {
                 if (ctl is T)
                  {
                     list.Add((T)ctl);
                 }
                 if (ctl.HasControls())
                  {
                     foreach (Control c in ctl.Controls)
                      {
                         findhelper(c, list);
                     }
                 }
             };
             List<T> controls =new List<T>();
             findhelper(control, controls);
             return controls;
         }

示例:

//從整個頁面裡查找所有Label
this.FindControls<Label>();
//從Panel裡查找所有Label
Panel1.FindControls<Label>();

  備注:

  在實際開發中有個不錯的應用場景——找到所有的RequiredFIEldValidator控件並統一設置其錯誤信息和提示信息:

             var rs = this.FindControls<RequiredFIEldValidator>();
             foreach (var r in rs)
              {
                 r.ErrorMessage = "*";
                 r.ToolTip = "不能為空";
             }

  當然,如果在FindControls中增加一個Action<T> 參數應該是個不錯的方案,這樣以上語句就可以直接寫成:

             var rs = this.FindControls<RequiredFIEldValidator>(r => {
                 r.ErrorMessage = "*";
                 r.ToolTip = "不能為空";        });

  5. 判斷本頁是是否使用AJax (其實就是判斷是否使用了ScriptManager):

         public static bool IsAJaxPage(this Page page)
          {
             return (ScriptManager.GetCurrent(page) != null);
         }
 
         public static bool IsAJaxPage(this Control control)
          {
             return (ScriptManager.GetCurrent(control.Page) != null);
         }

示例:

             if (this.IsAJaxPage())
              {
                 do sth about AJax 
             }

  6. UpdatePanel 調用Javascript 顯示信息:

         public static void Alert(this UpdatePanel panel, string message)
         {
             if (message.Length > 50)
             {
                 message = message.Substring(0, 50);//最多顯示50個字符
               }
             //去除Javascript不支持的字符
               message = Utility.ReplaceStrToScript(message);
             ScriptManager.RegisterClIEntScriptBlock(panel, panel.GetType(), "Message",
                    string.Format( " alert('{0}'); ", message) , true);
         }

  示例:

udpHeader.Alert("Hello,I'm Bruce!");//注:udpHeader 是UpdatePanel 類型

  把 alert 換成漂亮的提示框就perfect了。

  總結:

  實際項目中遠不止這幾個擴展方法,只是比較典型就發上來交流交流,其他的稍微有點復雜而且不經常用到。

  有了這些擴展方法,就可以去除項目中很多重復性代碼,歡迎大家提出更好的建議。

  末了發覺有點純代碼的味道,但實在這些方法都是入門級,也應該沒哪一個是看不懂的,也就不在這裡一一羅嗦

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved