快速业务通道

深入ASP.NET数据绑定(上)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
trol6();
5:     IParserAccessor accessor = __ctrl;
6:      accessor.AddParsedSubObject(control);
7: }
8:

在这个函数里,调用了另一个私有函数this.__BuildControl__control6,这个函数返回的一个 DataBoundLiteralControl对象,并将对象输出添加到__ctrl参数。事实上,只要我们去阅读 CompiledTempateBuilder就发现在,这里的__ctrol对象就是我们在实例化模板时传入的对象,也就是 ITemplate中的InstantiateIn方法的那个container参数对象。

为什么使用的是AddParsedSubObject方法,使用这个方法添加子控件相当于告诉父控件,这是一个已 经解析好的子控件对象,不需再去将控件解析成HTML代码,而在输出时直接输出Text属性的值即可。从这 里我们还可以得知DataBoundLiteralControl的对象,事实上就是承担了字符串拼接的职责,这一点我们 可以在后面的分析中得以验证。

__BuildControl__control6私有函数的定义如下:

1: [DebuggerNonUserCode]
2: private DataBoundLiteralControl __BuildControl__control6()
3: {
4: DataBoundLiteralControl control = new DataBoundLiteralControl(5, 4);
5: control.TemplateControl = this;
6: control.SetStaticString(0, "\r\n <tr>\r\n <td>\r\n ");
7: control.SetStaticString(1, "\r\n </td>\r\n <td>\r\n ");
8: control.SetStaticString(2, "\r\n </td>\r\n \r\n <td>\r\n ");
9: control.SetStaticString(3, "\r\n </td>\r\n <td>\r\n ");
10: control.SetStaticString(4, "\r\n </td>\r\n </tr>\r\n ");
11: control.DataBinding += new EventHandler(this.__DataBind__control6);
12: return control;
13: }

在这个函数里面,创建了一个DataBoundLiteralControl对象,并将页面上定义的模板的静态HTML代码 添加到该的静态字符串数组里,并且设置了它的绑定事件代理函数__DataBind__control6,该函数的定义 :

1: public void __DataBind__control6(object sender, EventArgs e)
2: {
3:      DataBoundLiteralControl control = (DataBoundLiteralControl) sender;
4:     RepeaterItem bindingContainer = (RepeaterItem) control.BindingContainer;
5:     control.SetDataBoundString(0, Convert.ToString(base.Eval("ID"), CultureInfo.CurrentCulture));
6:     control.SetDataBoundString(1, Convert.ToString (base.Eval("电流{a}"), CultureInfo.CurrentCulture));
7:     control.SetDataBoundString(2, Convert.ToString(base.Eval("备注''"), CultureInfo.CurrentCulture));
8:     control.SetDataBoundString(3, Convert.ToString (base.Eval("名称]"), CultureInfo.CurrentCulture));
9: }

在这个函数中,我们看到了真正的数据绑定代码了,它调用了TemplateControl的Eval方法来将当前数 据项的相应字段的值取出,并按一定的格式转化后添加到DataBoundLitreralControl对象中,并在 DataBoundLiteralControl将StaticString和DataBoundString字符串数组按一定的顺序拼接起来,作为 Text属性的输出值。而容器控件则直接向客户端输这段HTML。

下面,我们还有必要来分析下TemplateControl中的Eval方法,这个方法有两种重载,简单起见,我们 来分析较为简单的重载:

1: protected internal object Eval(string expression)
2: {
3:     this.CheckPageExists();
4:     return DataBinder.Eval(this.Page.GetDataItem(), expression);
5: }

这个方法,使用

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