网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

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

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 14/07/12

文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学的各位小编整理了ASP.net-教你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改属性名

  

  • 上一篇资讯: ASP.NET 4中的SEO改进
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号