轉(zhuǎn)帖|其它|編輯:郝浩|2011-02-01 10:40:44.000|閱讀 471 次
概述:數(shù)據(jù)綁定似乎是ASP.NET老掉牙的東西了。可是你知道嗎,只需要一點(diǎn)小小的改動(dòng)就可以替換Eval,擺脫字符串依賴并且大大提高性能。本文教你瞬間打造強(qiáng)類型ASP.NET數(shù)據(jù)綁定,希望對(duì)大家有幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
數(shù)據(jù)綁定似乎是ASP.NET老掉牙的東西了。可是你知道嗎,只需要一點(diǎn)小小的改動(dòng)就可以替換Eval,擺脫字符串依賴并且大大提高性能。
首先在code behind中加入以下方法
protected virtual object ExpHelper<TEntity, TREsult>(Func<TEntity, TREsult> func)
{
var itm = GetDataItem();
return func((TEntity)itm);}
這段代碼就是最核心的秘訣了,你完全可以忽視它到底在做什么。其實(shí)就是截獲每一個(gè)被綁定的數(shù)據(jù)項(xiàng),并進(jìn)行強(qiáng)類型轉(zhuǎn)換。
假設(shè)我們定義了學(xué)生類
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
如果希望在頁(yè)面中使用強(qiáng)類型訪問(wèn)學(xué)生類而不是用Eval,定義專門訪問(wèn)學(xué)生的方法
protected object Stu<TResult>(Func<Student, TResult> func)
{
return ExpHelper<Student, TResult>(func);
}
大功告成,于是在頁(yè)面里我們就能這樣綁定數(shù)據(jù)了
<ul>
<asp:Repeater ID="rptStudents" runat="server">
<ItemTemplate>
<li><%#Stu(_=>_.Name + "(" +_.Age+")")%></li><
/ItemTemplate>
</asp:Repeater>
</ul>
這樣做有四大優(yōu)勢(shì)
更神奇的是可以支持多層嵌套哦。比如我們定義學(xué)生的集合Group類和訪問(wèn)器,然后就能用嵌套的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)
{
//一群學(xué)生
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();
up1.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訪問(wèn)器
protected object Stu<TResult>(Func<Student, TResult> func)
{
return ExpHelper<Student, TResult>(func);
}
//Group訪問(wèn)器
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
本文是我以前寫的沒(méi)有發(fā)表的小發(fā)明,現(xiàn)在拿出來(lái)曬,主要是因?yàn)檫@個(gè)方法好像知道的人很少。希望大家能幫助測(cè)試一下性能,如果覺(jué)得合適大可以運(yùn)用到實(shí)際工作中。
更新:
感謝Dacey 韋恩卑鄙 dudu老大等人的建議
我已添加了擴(kuò)展方法版本。喜歡擴(kuò)展方法這種空降兵的感覺(jué)。
現(xiàn)在只要添加一個(gè)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);
}
}
在頁(yè)面中就可以
<%#this.Eval<Student>(_ => _.Name + "(" + _.Age + ")")%>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載