广

ASP.NET

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    ASP 2.0 数据绑定函数Eval()的机制

    2018-04-13 09:18:14 次阅读 稿源:互联网
    广告

      Author: Walkdan (walkdan(at)gmail.com)

       ASP.NET 2.0 的Eval()简化了掉了ASP 1.1 Container.DataItem,比如:

       <%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>      

       简化为:(去掉了类型指定 ASP 1.1, Eval通过反射实现,本文不再阐述)
       <%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>      

       又简化为(ASP 2.0):
       <%# Eval("ProductName") %>
       
       Eval()是TemplateControl:Page 的方法
       TemplateControl.Eval()可以自动计算出Container, 机制就是从一个dataBindingContext:Stack堆栈来获取。
       
       1. 建立DataItem Container 栈:
          在Control.DataBind()中,建立,这样可以保证子控件的DataItem Container始终在栈顶。
         
          public class Control
          {
              protected virtual void DataBind(bool raiseonDataBinding)
              {
                  bool foundDataItem = false;
                  if (this.IsBindingContainer)
                  {
                      object o = DataBinder.GetDataItem(this, out foundDataItem);
                      if (foundDataItem)
                          Page.PushDataItemContext(o);        <-- 将DataItem压入堆栈
                  }
                  try
                  {
                      if (raiseonDataBinding)
                          OnDataBinding(EventArgs.Empty);
                         
                      DataBindChildren();                     <-- 绑定子控件
                  }
                  finally
                  {
                      if (foundDataItem)
                          Page.PopDataItemContext();          <-- 将DataItem弹出堆栈
                  }
              }
          }

        2. 获取DataItem Container
          public class Page
          {   
              public object GetDataItem()
              {
                  ...
                  return this._dataBindingContext.Peek();     <-- 读取堆栈顶部的DataItem Container,就是正在绑定的DataItem Container
              }
           }
          
         3. TemplateContro.Eval()
          public class TemplateControl
          {
              protected string Eval (string expression, string format)
              {
                  return DataBinder.Eval (Page.GetDataItem(), expression, format);   
              }
          }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告