学习之路七:一步一步学习ASP.NET数据绑定
说来也奇怪,最近做了一个Web的项目,需要用到分页,那么数据绑定的学习也变的很重要了,下面结合博客园大牛们的文章来做个总结吧!
1.数据绑定表达式
①表达式
<%# 数据绑定表达式 %>
②在页面编写代码
<%= C#代码 %> //调用后台变量或者方法的时候,会用到这种表达式
2.单向绑定
提供一个单向的只读的数据值,只能从数据源中读取数据,不能修改数据源中的数据!
语法:
Eval(“列名|属性名等等”)
原理:通过反射的机制来实现绑定计算,写“Eval”会在底层调用DataBinder中的静态方法Eval!
推荐使用:DataBinder.Eval()用这种方式来绑定数据!
上面是他的三个重载方法!
第一个参数始终是 → Container.DataItem
第二个参数是 → 你要绑定的数据,如列名,属性名等等
第三个参数是 → 字符串格式化
如果需要详细了解,请参考:深入ASP.NET数据绑定(上),这是一篇深入理解单向数据绑定的好文!
3.双向绑定
双向绑定:既可以读取数据源的值,又可以修改数据源的值,以便进行数据的更新,主要用于GridView,DataList等支持编辑功能的控件!
语法:
Bind(“列名|属性名等等”)
推荐文章:深入ASP.NET数据绑定(中)——数据双向绑定机理
4.数据绑定表达式可以是哪些类型呢?
①可以是个变量
例如:<asp:Label ID="Label1" runat="server" Text="<%= 变量名%>"></asp:Label>
注意如果是变量,变量的反问修饰符不能是私有的,必须要为“public”或“protected”的!
Note:变量必须使用“=”才能有效果!
②可以是服务器控件的属性值
例如:<asp:Label ID="Label1" runat="server" Text="<%#TextBox2.Text %>"></asp:Label>
③可以是一个数组或集合
这种类型主要针对“DropDownList”,“ListBox”这类的控件!
有一个数组: public string[] str = { "22", "333", "4444444", "55555555555" };
那么你可以在前端进行绑定:<asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# str %>" > </asp:DropDownList>
Note:你必须要在后台调用控件的“DataBind”方法,不然是没有效果的!
④可以是个表达式
这个说明,你可以使用几种数据并接成你想要的数据!
如:我们要在一个Label中显示一个用户的全名,那么我们就可以这样写<%#(Person.FirstName+"" + Person.LastName)%>。
⑤可以是个方法
一开始以为也是使用上面的绑定方法,但是试了好多次都没效果,最后使用了另一种方式 → <% = MyReturn() %>,加了一个等于号,不是使用“#”!
⑥DataTable,DataSet等类型
Eval和DataBinder.Eval进行数据绑定!
这样的数据绑定表达式只能用于Repeater,GridView,DataList等等这些控件中!
推荐文章:浅谈.NET中的数据绑定表达式(一)
5.数据绑定表达式的演变
①第一种:最常用的
“Eval”是很多人经常在GridView,Repeater,DataList等控件中使用最多的!
②第二种:第一种方法的Father
这种写法也比较常见:
<%# DataBinder.Eval(Container.DataItem,”max_lvl”,”{0:c}” ) %>
Note:唯一要注意的是参数的选择!
第一种方法只是把第二种方法进行简化,底层还是会调用第二种方法的!
③第三种:性能最好的
如果是DataTable或DataSet类型必须要到用命名空间 → <%@ Import namespace="System.Data" %>
<%# ((DataRowView)Container.DataItem)["age"]%>
也可以这样写:
<%#(Container.DataItem as DataRowView)["ProductName"].ToString() %>
语法:
((DataRowView)(Container.DataItem))["列名"]/[列索引]的方式来
通用写法: ((Type)(Container.DataItem)) + 后面是你要获取的值
Note:Type是你的数据类型,可以是集合,DataTable等等!
演变历程:第三种 → 第二种 → 第一种,所以说现在很多人还在用Eval进行数据绑定,学过数据绑定的人都知道使用第三种方式是最好的!
推荐文章:浅谈.NET中的数据绑定表达式(一)
6.查看动态编译页面的程序集,有助于我们深入理解数据绑定底层原理
说实话不知道怎么用专业术语来表达,我的理解就是 → 这个程序集是基于C#代码和HTML的中间语言!
动态程序集查看地址:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
找到程序集使用Reflector来查看程序集,如果细致的看下去,我相信你应该有很大的收获的!
推荐文章::深入ASP.NET数据绑定(上),一步一步的带你熟悉页面编译代码!
7.自定义数据绑定格式
这个想法来源于一个博友的创新idea!参考:教你30秒打造强类型ASP.NET数据绑定!
其中有dudu大牛的改进版:强类型ASP.NET数据绑定改进版,以及增强版:强类型ASP.NET数据绑定改进版之第2版!
自定义代码如下:
1 public static class DataBindHelper
2 {
3 public static TResult Eval<TEntity, TResult>(this Page page, Func<TEntity, TResult> func)
4 {
5 var item = page.GetDataItem(); //这就是核心代码
6 return func((TEntity)item);
7 }
8 }
前台调用代码示例:
1 <asp:Repeater ID="Repeater1" runat="server">
2 <ItemTemplate>
3 <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%>
4 </ItemTemplate>
5 </asp:Repeater>
通过自定义的数据绑定格式能更友好的实现数据绑定!
Note:最好在VS2010上面实验,因为我在2010和2008一样的代码,运行时2008就报错了,“无效的表达式“>”,如果知道的朋友可以告诉我!
8.浅谈数据绑定底层机制
首先要记住在第七点中那句“page.GetDataItem()”代码,这句话可谓说是数据绑定的核心了,它的意思就是 → 获取绑定上下文堆栈顶部的对象!
有人说理解这个了,数据绑定技术也就是理解80% - 90%了,所以下面我们就重点研究下他!
说白了就是从堆里面读数据,只是微软封装的太厉害,只看到华丽的外表了!
推荐文章:深入剖析了各个数据绑定表达式的性能问题 → 浅谈.NET中的数据绑定表达式(二)
9.最后来个总结
灵活运行数据绑定技术可以加快开发速度,但千万不要滥用,在合适的场合运行合适的数据绑定,还有选择合适的数据绑定格式也很重要!
1 <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%> //定义数据绑定格式
2 <%# DataBinder.GetDataItem("Name") %>
3 <%# ((People)GetDataItem()).Name %>
4 <%# ((People)Container.DataItem).Name %>
5 <%# Eval("Name") %>
6 <%# DataBinder.Eval(Container.DataItem,"Name","") %>
7 <%# ((System.Data.DataRowView)GetDataItem())[0] %>
8 <%# ((System.Data.DataRowView)Container.DataItem)[0] %>
其实如果大家认真发现,以及使用Reflector去查看源代码,就会知道“GetDataItem”这个方法其实是最重要的,通过它去获取绑定上下文堆栈顶部的对象,从而实现绑定!
最后:大家如果跟着本文的步骤去一步步了解大牛们的文章,我相信你对数据绑定一定会有很深入的理解的!