教你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改属性名
|