快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
null) && !Convert.IsDBNull(value))
223:         {
224:              return false;
225:         }
226:         return true;
227:     }
228: }

其中我们可以发现有三个静态只读变量:

private static readonly char[] expressionPartSeparator = new char[] { ''.'' };
private static readonly char[] indexExprEndChars = new char[] { '']'', '')'' };
private static readonly char[] indexExprStartChars = new char[] { ''['', ''('' };

OK,我们先不看代码,就应该知道问题就出在这个地方。当我们分析哪里用到indexExprEndChars时分 找到这个方法:

public static object GetIndexedPropertyValue(object container, string expr)

我们不需要阅读里面的代码,通过下面的expr参数注释我们就可以很快得到答案:

expr     从 container 对象到要放置在绑定控件属性中的公共属性值的导航路径。此路径必须 是以点分隔的属性或字段名称字符串,如 C# 中的 Tables[0].DefaultView.[0].Price 或 Visual Basic 中的 Tables(0).DefaultView.(0).Price。

它告诉我们,我们不仅可以使用字段名的方式,同时还可以使用索引下标的方式来绑定字段值(C#和 VB,分别使用[]和()来取索引值),正因为如此,我们才不可以在字段名中使用括号和中括号。如上我们 假设"电压(V)"字段的索引下标是2,那么我们可以像下面这样绑定,来解决特别字段名带来的问题:

<td><%# Eval("[2])")%></td>

上面的注释同时还告诉,我们是可以通过一个对象的导航路径如 对象.属性.子属性 的方式来绑定一 个数据项的间接属性,这个我们可以通过对expressionPartSeparator静态字段的使用,得以验证:

1: public static object Eval(object container, string expression)
2: {
3:      if (expression == null)
4:     {
5:         throw new ArgumentNullException("expression");
6:     }
7:     expression = expression.Trim();
8:     if (expression.Length == 0)
9:     {
10:          throw new ArgumentNullException("expression");
11:     }
12:     if (container == null)
13:     {
14:         return null;
15:     }
16:     string[] expressionParts = expression.Split(expressionPartSeparator);
17:      return Eval(container, expressionParts);
18: }
19: private static object Eval(object container, string[] expressionParts)
20: {
21:     object propertyValue = container;
22:     for (int i = 0; (i < expressionParts.Length) && (propertyValue != null); i++)
23:     {
24:         string propName = expressionParts[i];
25:         if (propName.IndexOfAny (indexExprStartChars) < 0)
26:         {
27:             propertyValue = GetPropertyValue(propertyValue, propName);
28:         }
29:          else
30:         {
31:             propertyValue = GetIndexedPropertyValue(propertyValue, propName);
32:         }
33:     }
34:     return propertyValue;
35: }

前面的那个Eval重载,把expression表达式用expressionPartSeparator字符分隔开,然后调用内部的 Eval(object,string[])重载,在这个重载中,按顺序去一级一级递归遍历属性值,最终找到最后的那个

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号