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

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 IsAjax
Page(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了。

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

时间: 2025-01-28 04:58:58

扩展方法 之 Asp.Net篇的相关文章

[ASP.NET MVC]为HtmlHelper添加一个RadioButtonList扩展方法

在前面一篇文章中,我们通过对HtmlHelper的扩展简化了对DropDownList(Single-Line-Select)和ListBox(Multiple-Line-Select)的绑定,以及对作为数据源的列表进行单独维护.现在我们为HtmlHelper/HtmlHelper<Model>添加一个RadioButtonList/RadioButtonListFor扩展方法实现一组RadioButton的绑定.[源代码从这里下载] 一.RadioButtonListFor的使用 我们先来显

.NET 3.x新特性体验之扩展方法

今天我们接着看一下.NET 3.x的新特性:扩展方法.这里需要说明的是我所说的.NET 3.x的新特性,其实是C# 3.0的一些新特性,考虑到LinQ等我就把这些特性叫做.NET 3.x新特性.可能这样叫会有些歧义,但是我还是觉的这样还好,闲话不多说让我们进入正题.我觉得在C#3.0中引入自动化属性等就已经减少了我们不少负担,而扩展方法是我最喜欢的,它提供的可视化提示中显得更为巧妙.但是我也会觉得有点烦琐,当一个类的扩展方法太多时,就像有LinQ存在的情况下,会出现一大批的提示方法......

C#3.0 中使用扩展方法来扩展接口

有关扩展方法的一些知识点请参看我的前篇博客:C#3.0 中的扩展方法 (Extension Methods)前篇博客中我重点介绍了两个特殊场景:1.扩展方法跟原来类的方法重名时候的处理逻辑2.扩展方法的嵌套现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口 应用场景举例:我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需要再增加一个函数.有了扩展方法后,我们在这种情况下又多了一种实现的选择.下面以代码来说明这个问题:namespace Hongjun.Guo{interfac

《ASP.NET MVC验证框架中关于属性标记的通用扩展方法》之继续扩展

首先需要对xVal有点熟悉: http://www.codeplex.com/xval 建议下载最新源码而不是编译版本 再看两篇文章: http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval- validation-framework/ 深山老林将之翻译为:<ASP.NET MVC验证框架中关于属性标记的通用扩展方法> http://www.cnblogs.com/wlb/archive/2

扩展方法 之 基本数据篇

前一篇我列举了几个最常用到的基于Asp.Net的扩展方法,而这一篇基于基本数据的扩展方法理应不会逊一筹,因为它不局限于Asp.Net.何谓基本数据,这里直接摆定义: C# 中有两种基本数据类型:值类型和引用类型. 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元.字符串类型.数组. 说白了这篇就是扩展 int, string, double, DateTime...等基本类型.这么多数据类型,如果int来个扩展,double也来个扩展,肯定会是一个

艾伟_转载:扩展方法 之 基本数据篇

前一篇我列举了几个最常用到的基于Asp.Net的扩展方法,而这一篇基于基本数据的扩展方法理应不会逊一筹,因为它不局限于Asp.Net.何谓基本数据,这里直接摆定义: C# 中有两种基本数据类型:值类型和引用类型. 值类型包括:简单类型.结构类型.枚举类型:引用类型包括:Object 类型.类类型.接口.代表元.字符串类型.数组. 说白了这篇就是扩展 int, string, double, DateTime...等基本类型.这么多数据类型,如果int来个扩展,double也来个扩展,肯定会是一个

艾伟_转载:扩展方法 之 Redirect 篇

前言: 单看标题,可能很多朋友不知道我到底想写什么.在写这篇文章前,我自己跟自己斗争了很久,到底该不该写这篇文章?毕竟从现实主义来看,这篇文章可能落入"瞎扯淡"的行列,因为对大多数朋友来说,以下的所有扩展方法可能都不会用到. 如果真是这样,就当作一个"漫无边际"的想法来看好了.如果你根本不想浪费你的宝贵时间,就点这里 Redirect 回博客园主页,呵呵 一个 Redirect 为什么也可以耗费一篇文章的笔墨? 就 Redirect 一词成文的先例估计不会是我,但如

扩展方法 之 Redirect 篇

前言: 单看标题,可能很多朋友不知道我到底想写什么.在写这篇文章前,我自己跟自己斗争了很久,到底该不该写这篇文章?毕竟从现实主义来看,这篇文章可能落入"瞎扯淡"的行列,因为对大多数朋友来说,以下的所有扩展方法可能都不会用到. 如果真是这样,就当作一个"漫无边际"的想法来看好了.如果你根本不想浪费你的宝贵时间,就点这里 Redirect 回博客园主页,呵呵 一个 Redirect 为什么也可以耗费一篇文章的笔墨? 就 Redirect 一词成文的先例估计不会是我,但如

c#扩展方法奇思妙用高级篇八:Type类扩展

Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型.下面的类就针对这些地方进行扩展. 1 public static class TypeHelper 2 { 3 public static bool IsNullableType(this Type type) 4 { 5 return (((type != null) && type.IsGenericType) && 6 (type.