说来也奇怪,最近做了一个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)) + 后面是你要获取的值 演变历程:第三种 → 第二种 → 第一种,所以说现在很多人还在用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 前台调用代码示例: 1 <asp:Repeater ID="Repeater1" runat="server"> 通过自定义的数据绑定格式能更友好的实现数据绑定! Note:最好在VS2010上面实验,因为我在2010和2008一样的代码,运行时2008就报错了,“无效的表达式“>”,如果知道的朋友可以告诉我! 8.浅谈数据绑定底层机制 首先要记住在第七点中那句“page.GetDataItem()”代码,这句话可谓说是数据绑定的核心了,它的意识就是 → 获取绑定上下文堆栈顶部的对象! 有人说理解这个了,数据绑定技术也就是理解80% - 90%了,所以下面我们就重点研究下他! 说白了就是从堆里面读数据,只是微软封装的太厉害,只看到华丽的外表了! 推荐文章:深入剖析了各个数据绑定表达式的性能问题 → 浅谈.NET中的数据绑定表达式(二) 9.最后来个总结 灵活运行数据绑定技术可以加快开发速度,但千万不要滥用,在合适的场合运行合适的数据绑定,还有选择合适的数据绑定格式也很重要! 1 <%# DataBindHelper.Eval<People,string>(this,p=>p.Name)%> //定义数据绑定格式 其实如果大家认真发现,以及使用Reflector去查看源代码,就会知道“GetDataItem”这个方法其实是最重要的,通过它去获取绑定上下文堆栈顶部的对象,从而实现绑定! 最后:大家如果跟着本文的步骤去一步步了解大牛们的文章,我相信你对数据绑定一定会有很深入的理解的! |
|