数据绑定似乎是ASP.NET老掉牙的东西了。可是你知道吗,只需要一点小小的改动就可以替换Eval,摆脱字符串依赖并且大大提高性能。
首先在code behind中加入以下方法
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func)
{
var itm = GetDataItem();
return func((TEntity)itm);
}
这段代码就是最核心的秘诀了,你完全可以忽视它到底在做什么。其实就是截获每一个被绑定的数据项,并进行强类型转换。
假设我们定义了学生类
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
如果希望在页面中使用强类型访问学生类而不是用Eval,定义专门访问学生的方法
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->protected object Stu<TResult>(Func<Student, TResult> func)
{
return ExpHelper<Student, TResult>(func);
}
大功告成,于是在页面里我们就能这样绑定数据了
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><ul>
<asp:Repeater ID="rptStudents" runat="server">
<ItemTemplate>
<li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li>
</ItemTemplate>
</asp:Repeater>
</ul>
这样做有四大优势
- 得到编译时检测
- 享受智能提示
- 强类型转换比Eval反射性能更高
- 页面中的表示更丰富,如上我们可以自由拼接想要的字符串,非常像MVC
更神奇的是可以支持多层嵌套哦。比如我们定义学生的集合Group类和访问器,然后就能用嵌套的Repeater显示分组信息了。完整程序如下
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><%@ 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的帮助类,名字随你喜欢
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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);
}
}
在页面中就可以
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><%#this.Eval<Student>(_ => _.Name + "(" + _.Age + ")")%>
- 注意this是必须的
- 扩展方法具有很好的粘合性
- 不需要一个父类定义通用方法
- 泛型提供多个副本并且容易看清类型
- 另外能很好的支持refactor,大家试试用ctrl+r+r改属性名
分享到:
相关推荐
3. **数据绑定**:ASP.NET提供了强大的数据绑定机制,使得在网页中显示和操作数据库中的数据变得简单。例如,GridView、ListView和Repeater控件可以轻松实现数据的展示和编辑。 4. **状态管理**:ASP.NET通过视图...
ASP.NET 2.0 是微软推出的用于构建动态网站的框架,它允许开发者使用C#等.NET支持的语言进行高效开发。本教程重点介绍了如何...在ASP.NET 2.0的框架下,结合C#的强类型和面向对象特性,开发动态网站变得更加得心应手。
1. 数据绑定:ASP.NET提供多种数据绑定技术,如Repeater、GridView、ListView等,可以方便地将数据库数据展示在网页上。 2. 用户身份验证和授权:ASP.NET的成员资格和角色管理让我们能轻松控制用户访问权限,实现...
ASP.NET MVC2框架提供了许多增强功能,比如强类型视图,它允许开发者在视图中直接使用数据模型,提高了代码的可读性和安全性。另外,辅助方法(Helper)是视图中的一个重要特性,它们提供了一种简洁的方式来生成HTML...
ASP.NET 3.5通过ADO.NET提供了强大的数据访问能力,包括Entity Framework,使得开发者可以更容易地操作数据库并进行数据绑定。 9. **Web服务和WCF** Windows Communication Foundation (WCF)是.NET 3.5中的服务...
ASP.NET是.NET框架的一部分,它提供了丰富的服务器控件、事件驱动模型以及自动页面生命周期管理,使得开发人员可以使用诸如C#或VB.NET等强类型语言来编写代码。与传统的HTML页面不同,ASP.NET页面在服务器端运行,...
本文将从三个方面介绍该控件的实现方法:首先,介绍如何在 ASP.NET 项目中添加 Telerik 的 RadComboBox 控件;其次,介绍如何在后台绑定下拉框的数据源;最后,介绍如何实现下拉框的检索功能。 一、引用 dll 文件 ...
5. **ASP.NET页面生命周期**:在ASP.NET Web Forms中,每个页面都有一个生命周期,包括初始化、加载视图状态、绑定控件、回发和验证等步骤。理解这个生命周期对于优化性能和处理用户输入至关重要。 6. **VB.NET与...
2. **语法变化**:ASP.NET引入了C#或VB.NET等强类型编程语言,与ASP的脚本语言相比,它们具有更好的类型检查和错误处理能力。此外,ASP.NET支持代码隐藏,将业务逻辑和视图分离,提高了可维护性。 3. **页面生命...
【ASP.NET实用教程】 ASP.NET 是一种用于构建Web应用程序的框架,由微软开发,它基于.NET Framework,提供了丰富的...此外,你还将接触到数据访问、安全性、缓存管理等高级主题,逐步成为一名熟练的ASP.NET开发者。
视图可以利用强类型化的ViewData或ViewBag来获取模型数据。 MvcD.sln 文件是一个Visual Studio解决方案文件,包含项目的配置信息和引用的项目。当你打开这个文件时,Visual Studio将加载所有相关的项目和依赖项,让...
通过ASP.NET MVC5,开发者可以使用razor视图引擎编写视图,利用强类型的ViewModel传递数据。控制器可以调用业务层服务,处理请求并返回视图结果。同时,通过使用Action Filters,可以在执行控制器操作前后添加自定义...
2. C#语言与VB.NET:ASP.NET 3.5主要使用的两种编程语言是C#和VB.NET,书中会详细介绍这两种语言的基础语法、面向对象编程、异常处理和高级特性,如泛型、匿名类型和Lambda表达式。 3. Web Forms:作为ASP.NET的...
ASP.NET MVC(Model-View-Controller)是一种轻量级、可测试的Web应用框架,它鼓励分离关注点和使用瘦控制器、强类型视图和独立模型。MVC模式提供了更灵活的架构,允许开发者更好地控制HTML输出和业务逻辑的分离。...
此外,Linq to SQL也是一个常用的数据访问技术,它提供了强类型化的查询语言,简化了SQL语句的编写。 在安全性方面,ASP.NET 3.5提供了身份验证和授权服务,如Forms Authentication用于验证用户凭据,角色管理用于...
此外,你还将学习视图(Views)如何渲染模型数据,以及如何使用强类型视图提高代码的健壮性。 对于Web API部分,你将学习如何创建HTTP服务,处理GET、POST等请求,以及如何使用JSON或XML格式交换数据。这有助于你...
ASP.NET Web Forms、ASP.NET MVC和ASP.NET Core是ASP.NET中的三种主要开发模式。 在VB.NET和ASP.NET代码手册中,你可能会找到以下关键知识点: 1. **基础语法**:VB.NET和ASP.NET的基础语法,包括变量声明、数据...
ASP.NET提供了强大的数据绑定功能,能够方便地将数据库或其他数据源的数据绑定到控件上。例如,GridView控件可以用来展示数据表,Repeater控件则允许自定义数据呈现的格式。 五、ASP.NET状态管理 ASP.NET提供了多种...
在“ASP.NET 2.0驾校”中,你可能会学到如何利用这些特性来构建功能丰富的Web应用程序,包括如何创建页面、使用母版页、处理用户输入、执行数据绑定、实现用户身份验证和角色管理,以及如何调试和优化ASP.NET 2.0...
ASP.NET数据绑定是微软.NET框架下用于构建动态Web应用程序的核心技术之一。它允许开发者将数据源(如数据库、XML文件或对象集合)的数据与UI元素(如控件)连接起来,使得数据的更新能自动反映在用户界面上,极大地...