教你30秒打造強型別ASP.NET資料繫結

來源:互聯網
上載者:User

更新:感謝Dacey 韋恩卑鄙 dudu老大等人的建議我已添加了擴充方法版本。喜歡擴充方法這種空降兵的感覺

資料繫結似乎是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>

這樣做有四大優勢

  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);
}
}

在頁面中就可以

<%#this.Eval<Student>(_ => _.Name + "(" + _.Age + ")")%>
  • 注意this是必須的
  • 擴充方法具有很好的粘合性
  • 不需要一個父類定義通用方法
  • 泛型提供多個副本並且容易看清類型
  • 另外能很好的支援refactor,大家試試用ctrl+r+r改屬性名稱
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.