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

示例:

  
  //从整个页面里查找ID为lblTest的Label
this.FindControl("lblTest");
//从Panel里查找ID为lblTest的Label
Panel1.FindControl("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();
//从Panel里查找所有Label
Panel1.FindControls();

备注:
  在实际开发中有个不错的应用场景——找到所有的RequiredFieldValidator控件并统一设置其错误信息和提示信息:

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

  当然,如果在FindControls中增加一个Action 参数应该是个不错的方案,这样以上语句就可以直接写成:

  
   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 类型

   
   

添加  public static class MyExtensions
    {
        public static Color ToColor(this string colorName)
        {
            if (colorName.StartsWith("#"))
                colorName = colorName.Replace("#", string.Empty);
            int v = int.Parse(colorName, System.Globalization.NumberStyles.HexNumber);
            return new Color()
            {
                A = Convert.ToByte((v >> 24) & 255),
                R = Convert.ToByte((v >> 16) & 255),
                G = Convert.ToByte((v >> 8) & 255),
                B = Convert.ToByte((v >> 0) & 255)
            };
        }
    }
调用: rectangle1.Fill = new SolidColorBrush("#FFF5F5F5".ToColor());

   
   

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

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

0
0
来自: 博客园
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值