zoukankan      html  css  js  c++  java
  • ASP.NET Eval如何进行数据“.NET研究”绑定 狼人:

      ASP.NET Eval在数据绑定方面的应用是众所周知的,不过技术在发展,当ASP.NET Eval 1.1变成ASP.NET Eval 2.0的时候,在操作的时候会有什么变化呢?

      假设你已经了解ASP.NET Eval 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP.NET Eval 2.0数据绑定做了那些改进。

      ASP.NET Eval 2.0 的数据绑定函数Eval()简化掉了ASP.NET Eval 1.1神秘的Container.DataItem,比如数据绑定表达式:

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

      ASP.NET Eval 1.1简化为:(去掉了类型指定, Eval通过反射实现,本文不再阐述)

    %# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %

      ASP.NET Eval 2.0又简化为,去掉了Container局部变量:

    %# Eval("ProductName") %

      那么,Page.Eval()又是如何知道"ProductName"是那个数据的属性呢,即Container.DataItem真的消失了吗?

      ASP.NET Eval()是Page的父类TemplateContr上海网站建设ol的方法

      TemplateControl.Eval()可以自动计算出Container, 机制就是从一个dataBindingContext:Stack堆栈来获取。

      1. 建立DataItem Container 栈:

      在Control.DataBind()中,建立,这样可以保证子控件的DataItem Container始终在栈顶。

    public class上海企业网站设计与制作le="color: #000000;"> 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.PopDataItemCont上海闵行企业网站制作ext(); <
    -- 将DataItem弹出堆栈 }
     }
    }

      2. 获取DataItem Container 上海徐汇企业网站制作ong>

    public class Page {
     
    public object GetDataItem()
     { ...
    return this._dataBindingContext.Peek();
    -- 读取堆栈顶部的DataItem Container,就是正在绑定的DataItem
     Container
     }
    }

      3. TemplateControl.Eval()

    public上海闵行企业网站设计与制作w.93tj.com'>上海企业网站制作pan style="color: #000000;"> class TemplateControl {
     
    protected string Eval (string expression, string format)
     {
    return DataBinder.Eval (Page.GetDataItem(), expression, format);
     }
    }

      结论:

      从上面看出Page.Eval()在计算的时候还是引用了Container.DataItem,只不过这个DataItem通过DataItem Container堆栈自动计算出来的。我认为Page.Eval()看似把问题简化了,其实把问题搞得更加神秘。

  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/waw/p/2213555.html
Copyright © 2011-2022 走看看