找回密码
 立即注册
首页 业界区 业界 教你30秒打造强类型ASP.NET数据绑定

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

每捎京 2025-5-29 15:36:04
更新:感谢Dacey 韦恩卑鄙 dudu老大等人的建议我已添加了扩展方法版本。喜欢扩展方法这种空降兵的感觉
数据绑定似乎是ASP.NET老掉牙的东西了。可是你知道吗,只需要一点小小的改动就可以替换Eval,摆脱字符串依赖并且大大提高性能。
首先在code behind中加入以下方法
  1. protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func)<br>{<br>    var itm = GetDataItem();<br>    return func((TEntity)itm);<br>}
复制代码
这段代码就是最核心的秘诀了,你完全可以忽视它到底在做什么。其实就是截获每一个被绑定的数据项,并进行强类型转换。
假设我们定义了学生类
  1. public class Student<br>{<br>   public string Name { get; set; }<br>   public int Age { get; set; }<br>}
复制代码
如果希望在页面中使用强类型访问学生类而不是用Eval,定义专门访问学生的方法
  1. protected object Stu<TResult>(Func<Student, TResult> func)<br>{<br>   return ExpHelper<Student, TResult>(func);<br>}
复制代码
大功告成,于是在页面里我们就能这样绑定数据了
  1. <ul><br><br><ItemTemplate><br>   <li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li><br></ItemTemplate><br></asp:Repeater><br></ul>
复制代码
这样做有四大优势

  • 得到编译时检测
  • 享受智能提示
  • 强类型转换比Eval反射性能更高
  • 页面中的表示更丰富,如上我们可以自由拼接想要的字符串,非常像MVC
更神奇的是可以支持多层嵌套哦。比如我们定义学生的集合Group类和访问器,然后就能用嵌套的Repeater显示分组信息了。完整程序如下
  1. <%@ Page Language="C#" AutoEventWireup="true"%><br><br><br><!DOCTYPE html><br><html><br><body><br>    <%--单层--%><br>   <ul><br>   <br>   <ItemTemplate><br>      <li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li><br>   </ItemTemplate><br>   </asp:Repeater><br>   </ul><br><br>    <%--嵌套--%><br>    <ul><br>    <br>    <ItemTemplate><br>      <li><br>         <ol><br>         _.Students) %>'><br>            <ItemTemplate><br>               <li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li><br>            </ItemTemplate><br>         </asp:Repeater><br>         </ol>         <br>      </li><br>    </ItemTemplate><br>    </asp:Repeater><br>    </ul><br></body><br></html>
复制代码
PS
本文是我以前写的没有发表的小发明,现在拿出来晒,主要是因为这个方法好像知道的人很少。希望大家能帮助测试一下性能,如果觉得合适大可以运用到实际工作中。
 

更新:
感谢Dacey 韦恩卑鄙 dudu老大等人的建议
我已添加了扩展方法版本。喜欢扩展方法这种空降兵的感觉。
现在只要添加一个static的帮助类,名字随你喜欢
  1. public static class Helper<br>{<br>   static object ExpHelper<TEntity, TResult>(Page page, Func<TEntity, TResult> func)<br>   {<br>      var itm = page.GetDataItem();<br>      return func((TEntity)itm);<br>   }<br><br>   public static object Eval<T>(this Page page, Func<T, object> func)<br>   {<br>      return ExpHelper<T, object>(page, func);<br>   }<br>}
复制代码
在页面中就可以
  1. <%#this.Eval<Student>(_ => _.Name + "(" + _.Age + ")")%>
复制代码

  • 注意this是必须的
  • 扩展方法具有很好的粘合性
  • 不需要一个父类定义通用方法
  • 泛型提供多个副本并且容易看清类型
  • 另外能很好的支持refactor,大家试试用ctrl+r+r改属性名

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册