教你30秒打造强类型ASP.NET数据绑定

  数据绑定似乎是ASP.NET老掉牙的东西了。可是你知道吗,只需要一点小小的改动就可以替换Eval,摆脱字符串依赖并且大大提高性能。

  首先在code behind中加入以下方:

protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func)

{

var itm = GetDataItem();

return func((TEntity)itm);

}

  这段代码就是最核心的秘诀了,你完全可以忽视它到底在做什么。其实就是截获每一个被绑定的数据项,并进行强类型转换。

  假设我们定义了学生类:  

public class Student

{

public string Name { get; set; }

public int Age { get; set; }

}

  如果希望在页面中使用强类型访问学生类而不是用Eval,定义专门访问学生的方法:

protected object Stu<TResult>(Func<Student, TResult> func)

{

return ExpHelper<Student, TResult>(func);

}

  大功告成,于是在页面里我们就能这样绑定数据了:

<ul>

<asp:Repeater ID="rptStudents" runat="server">

<ItemTemplate>

<li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li>

</ItemTemplate>

</asp:Repeater>

</ul>

  这样做有四大优势:

得到编译时检测 享受智能提示 强类型转换比Eval反射性能更高 页面中的表示更
丰富,如上我们可以自由拼接想要的字符串,非常像MVC

  更神奇的是可以支持多层嵌套哦。比如我们定义学生的集合Group类和访问器,然后就能用嵌套的Repeater显示分组信息了。完整程序如下:

<%@
Page Language="C#" AutoEventWireup="true"%>

<script runat="server">

public class Student

{

public string Name { get; set; }

public int Age { get; set; }

}

public class Group

{

public IEnumerable<Student> Students { get; set; }

}

protected void Page_Load(object sender, EventArgs e)

{

//一群学生

var students = new[] {

new Student{Name="mike",Age=23},

new Student{Name="jane", Age=12},

new Student{Name="frank",Age=25},

new Student{Name="susan",Age=32},

};

rptStudents.DataSource = students;

//分两组

var group0 = new Group();

group0.Students = students.Take(2);

var group1 = new Group();

group1.Students = students.Skip(2).Take(2);

rptGroups.DataSource = new[] { group0, group1 };

DataBind();

}

protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func)

{

var itm = GetDataItem();

return func((TEntity)itm);

}

//Student访问器

protected object Stu<TResult>(Func<Student, TResult> func)

{

return ExpHelper<Student, TResult>(func);

}

//Group访问器

protected object Grp<TResult>(Func<Group, TResult> func)

{

return ExpHelper<Group, TResult>(func);

}

</script>

<!DOCTYPE html>

<html>

<body>

<%--单层--%>

<ul>

<asp:Repeater ID="rptStudents" runat="server">

<ItemTemplate>

<li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li>

</ItemTemplate>

</asp:Repeater>

</ul>

<%--嵌套--%>

<ul>

<asp:Repeater ID="rptGroups" runat="server">

<ItemTemplate>

<li>

<ol>

<asp:Repeater ID="Repeater1" runat="server" DataSource='<%#Grp(_=>_.Students) %>'>

<ItemTemplate>

<li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li>

</ItemTemplate>

</asp:Repeater>

</ol>

</li>

</ItemTemplate>

</asp:Repeater>

</ul>

</body>

</html>

  PS:本文是我以前写的没有发表的小发明,现在拿出来晒,主要是因为这个方法好像知道的人很少。希望大家能帮助测试一下性能,如果觉得合适大可以运用到实际工作中。

  更新:

  感谢Dacey 韦恩卑鄙 dudu老大等人的建议。
  我已添加了扩展方法版本。喜欢扩展方法这种空降兵的感觉。

  现在只要添加一个static的帮助类,名字随你喜欢:

public static class Helper

{

static object ExpHelper<TEntity, TResult>(Page page, Func<TEntity, TResult> func)

{

var itm = page.GetDataItem();

return func((TEntity)itm);

}

public static object Eval<T>(this Page page, Func<T, object> func)

{

return ExpHelper<T, object>(page, func);

}

}

  在页面中就可以:

<%#this.Eval<Student>(_ => _.Name + "(" + _.Age + ")")%> 注意this是必须的。 扩展方法具有很好的粘合性。 不需要一个父类定义通用方法。 泛型提供多个副本并且容易看清类型。 另外能很好的支持refactor,大家试试用ctrl+r+r改属性名。

时间: 2024-09-20 08:42:48

教你30秒打造强类型ASP.NET数据绑定的相关文章

一起谈.NET技术,教你30秒打造强类型ASP.NET数据绑定

相关文章:强类型ASP.NET数据绑定改进版.强类型ASP.NET数据绑定改进版之第2版 数据绑定似乎是ASP.NET老掉牙的东西了.可是你知道吗,只需要一点小小的改动就可以替换Eval,摆脱字符串依赖并且大大提高性能. 首先在code behind中加入以下方: protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func){ var itm = GetDataItem();ret

教你30秒打造强类型ASP.NET数据“.NET研究”绑定

相关文章:强类型ASP.NET数据绑定改进版.强类型ASP.NET数据绑定改进版之第2版 数据绑定似乎是ASP.NET老掉牙的东西了.可是你知道吗,只需要一点小小的改动就可以替换Eval,摆脱字符串依赖并且大大提高性能. 首先在code behind中加入以下方: protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func){ var itm = GetDataItem();ret

强类型ASP.NET数据绑定改进版之第2版

相关文章:教你30秒打造强类型ASP.NET数据绑定.强类型ASP.NET数据绑定改进版 之前的方法存在一个问题: Ivony...说:"每个类型都去写个Eval方法也很不爽的." Kingthy说:"这样就到处有Func了,会不会太过头了?" 李永京说:"在项目中任何地方都要使用的方法,应该收集在Core级别的Dll中写成扩展方法." 如果用扩展方法解决这个问题,我们将面临新的问题,请看扩展方法: public static class Bin

强类型ASP.NET数据绑定改进“.NET研究”版

相关文章:教你30秒打造强类型ASP.NET数据绑定.强类型ASP.NET数据绑定改进版之第2版 看了dragonpig写的"教你30秒打造强类型ASP.NET数据绑定",眼前一亮,真是太给力了,原来还可以这样进行数据绑定. 立即小试了一下,并进行了一些改进,目前已经应用于Home中的新闻栏目.下面分享一下改进心得. 使用传统的ASP.NET数据绑定方法,有两个地方一直让人不爽: 1) 缺少智能感知: 2) 强制类型转换. 先回味一下传统的ASP.NET数据绑定: 看看上面的ToStr

一起谈.NET技术,强类型ASP.NET数据绑定改进版

相关文章:教你30秒打造强类型ASP.NET数据绑定.强类型ASP.NET数据绑定改进版之第2版 看了dragonpig写的"教你30秒打造强类型ASP.NET数据绑定",眼前一亮,真是太给力了,原来还可以这样进行数据绑定. 立即小试了一下,并进行了一些改进,目前已经应用于Home中的新闻栏目.下面分享一下改进心得. 使用传统的ASP.NET数据绑定方法,有两个地方一直让人不爽: 1) 缺少智能感知: 2) 强制类型转换. 先回味一下传统的ASP.NET数据绑定: 看看上面的ToStr

一起谈.NET技术,强类型ASP.NET数据绑定改进版之第2版

相关文章:教你30秒打造强类型ASP.NET数据绑定.强类型ASP.NET数据绑定改进版 之前的方法存在一个问题: Ivony...说:"每个类型都去写个Eval方法也很不爽的." Kingthy说:"这样就到处有Func了,会不会太过头了?" 李永京说:"在项目中任何地方都要使用的方法,应该收集在Core级别的Dll中写成扩展方法." 如果用扩展方法解决这个问题,我们将面临新的问题,请看扩展方法: public static class Bin

教您30分钟打造基于Linux的VPN服务器

VPN(Virtual http://www.aliyun.com/zixun/aggregation/33969.html">Private Network,虚拟专用网络)是专用网络的延伸,它可以通过共享Internet或公共网络连接模拟点对点专用连接的方式,在本地计算机和远程计算机之间发送数据. 它具有良好的保密性和不受干扰性,使双方能够进行自由而安全的点对点连接.下面介绍一种快速构建VPN服务器的方法. 安装软件 1.安装PPP 安装PPP(Point-to-Point Protoc

强类型ASP.N“.NET研究”ET数据绑定改进版之第2版

相关文章:教你30秒打造强类型ASP.NET数据绑定.强类型ASP.NET数据绑定改进版 之前的方法存在一个问题: Ivony...说:"每个类型都去写个Eval方法也很不爽的." Kingthy说:"这样就到处有Func了,会不会太过头了?" 李永京说:"在项目中任何地方都要使用的方法,应该收集在Core级别的Dll中写成扩展方法." 如果用扩展方法解决这个问题,我们将面临新的问题,请看扩展方法: public static class Bin

阿里云上从ASP.NET线程角度对“黑色30秒”问题的全新分析_实用技巧

在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. "黑色30秒"问题现象的主要特征是:排队的请求(Requests Queued)突增,到达HTTP.SYS的请求数(Arrival Rate)下降,QPS(Requests/Sec)下降,CPU消耗下降,Current Connections上升. 昨天晚上18:08左右发生了1次"黑色30秒",正好借此案例分析一下. 1.为什么Requests Qu