当前位置: 首页 > news >正文

首先在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>

这样做有四大优势

  1. 得到编译时检测
  2. 享受智能提示
  3. 强类型转换比Eval反射性能更高
  4. 页面中的表示更丰富,如上我们可以自由拼接想要的字符串,非常像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);
}
}

http://www.jsqmd.com/news/1125839/

相关文章:

  • 一撸猫就喷嚏不停?毛发过敏,真不全是毛的锅
  • HBuilderX 创建 Vue3 uniCloud 项目
  • 构建AI知识库SOP:用RAG与GitCode实现品牌信息精准引用
  • DeepSeek-V3.2 二五折半年记:低价 API 到底把哪些场景做了起来
  • 使用DryadLINQ
  • 深入解析TipDM大数据挖掘建模平台:从拖拽式可视化建模、全生命周期管理到产学研一体化应用的实战指南
  • Windows Phone 7重量级版本升级 - Mango (芒果)
  • 【SI_加重技术】快速了解高速信号传输加重技术
  • Learn Harness Engineering 课程全总结:12 讲核心要点
  • Qt 高级编程 034:深耕QWidget底层内核—彻底吃透无边框窗口设计核心原理
  • 自动化设备为什么要用减速机?以 ANDANTEX(恩坦斯特)精密传动选型为例
  • Power BI工具提示实战:构建可交互的微型子报表
  • 推荐六款小众实用宝藏APP
  • DeepLabv3+ 特征图可视化实战:从单通道提取到伪彩色映射的5步流程
  • EdgeRemover:Windows 10/11 中专业卸载Microsoft Edge的终极解决方案
  • 如何高效使用QRazyBox:终极二维码修复与恢复完全指南
  • 天学网英语听力对孩子有用吗?2026最新实测给家长靠谱答案
  • 什么是函数式编程
  • 为什么网卡停止收包?——Intel网卡RX Buffer Replenishment机制深度解析(上)
  • Bellman方程 - RL强化学习中价值估计的数学根基
  • LangChain快速入门-03Retrieval(上)
  • 为什么测试这么难写?
  • HagiCode 是怎么把 13 个 Agent CLI 接到一套系统里的
  • 成都热门的中央空调企业哪家可靠
  • 告别重复劳动!GIMP BIMP批量图像处理插件完全指南
  • 自动售货机运营需要了解哪些政策法规?新手必看~YH
  • 数据血缘追踪与元数据管理平台
  • NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead
  • 全球邮轮旅行服务市场投资前景分析及发展研究建议报告2026年版
  • Nano Banana 2 怎么用?14 种宽高比 + 4K 出图完整步骤