扩展方法 之 Asp.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);
         }

示例:

 //从整个页面里查找IDlblTestLabel
this.FindControl<Label>("lblTest");
//Panel里查找IDlblTestLabel
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(050);//最多显示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了。


总结
实际项目中远不止这几个扩展方法,只是比较典型就发上来交流交流,其他的稍微有点复杂而且不经常用到。
有了这些扩展方法,就可以去除项目中很多重复性代码,欢迎大家提出更好的建议。
末了发觉有点纯代码的味道,但实在这些方法都是入门级,也应该没哪一个是看不懂的,也就不在这里一一罗嗦。

posted on 2009-09-26 08:46  ToKens  阅读(196)  评论(0编辑  收藏  举报