快速业务通道

深入ASP.NET数据绑定(下)——多样的绑定方式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

在这个系列的上篇中介绍了数据绑定语法的原理以及.NET中如何实现单向绑定,中篇我们简单的介绍 了ASP.NET 2.0 中新增的Bind语法配合DataSourceControl来实现数据的自动双向绑定。这两部分的内容 相对动态抽象并且不常接触,没有很好的源代码支持很难解释清楚,要想真正弄清它们的内部原理,还需 要大家亲自动手去反编译分析动态编译的程序集。

在了解了数据绑定语法的原理后,我还想来谈谈我中实践过程中遇到的一些问题以及其它实用的绑定 技巧。首先我们就来说说,特殊字段名的问题。我们知道在数据库当中,如果表名或字段名中包含有一些 特殊的不能是合法的字符时,都会使用[]将它们引起来,以便他们能够正常使用。但是在<%# Eval ("")%>的绑定语句当中,同时可以使用[],但是对于字段名中包含 "(",")","[","]"这4个字符却始终 运行出错。假设像我下面这样来绑定"电压(V)":

<%# Eval("电压(V)")%>

那么就会得到一个运行时错误:

DataBinding:“System.Data.DataRowView”不包含名为“电压”的属性。

表明括号是被认为是一个特殊字符,那我们如果给字段名加上[],如下:

<%# Eval("[电压(V)]")%>

此时,我们会得到另一个运行时错误:

电压(V 既不是表 DataTable1 的 DataColumn 也不是 DataRelation。

表明,即使加上[]也无法解决这个特殊字段名的问题。同时字段名中如果也存在中括号,也是会出现 这样的问题的。但是这样的字段名却在GridView的自动生成列中能被正常绑定呢?问题会出现在哪里呢? 分析和对比GridView的自动生成列与Eval这样的绑定语法在最终执行绑定代码上的不同,我们可以发现, GridView的自动生成列取值并不是使用DataBinder.Eval这个方法,它内部有自己的取值方式,但是在实 现上却是大同小异的。那究竟是在哪里出现了问题呢?我们找出DataBinder类的定义:

1: [AspNetHostingPermission(SecurityAction.LinkDemand, Level=200)]
2: public sealed class DataBinder
3: {
4:     // Fields
5:     private static readonly char[] expressionPartSeparator = new char[] { ''.'' };
6:     private static readonly char[] indexExprEndChars = new char[] { '']'', '')'' };
7:     private static readonly char[] indexExprStartChars = new char[] { ''['', ''('' };
8:
9:     // Methods
10:     public static object Eval(object container, string expression)
11:      {
12:         if (expression == null)
13:         {
14:              throw new ArgumentNullException("expression");
15:         }
16:         expression = expression.Trim();
17:         if (expression.Length == 0)
18:         {
19:             throw new ArgumentNullException("expression");
20:         }
21:         if (container == null)
22:         {
23:             return null;
24:         }
25:         string[] expressionParts = expression.Split(expressionPartSeparator);
26:         return Eval(container, expressionParts);
27:     }
28:
29:     private static object Eval(object container, string[] expressionParts)
30:     {
31:         object propertyValue = container;
32:         for (int i = 0; (i <

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号