知识大全 支持入门—ASP.NET常用技巧

Posted

篇首语:亦余心之所善兮,虽九死其犹未悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 支持入门—ASP.NET常用技巧相关的知识,希望对你有一定的参考价值。

支持入门—ASP.NET常用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在上一篇《深入ASP NET数据绑定(上)》中 我们分析了在 NET中的数据绑定语法的一些内部机理 简单说来就是ASP NET在运行时为我们完成了页面的动态编译 并解析页面的各种服务器端代码 包括数据绑定语法 而数据绑定的语法虽是一些<%# %>代码块 在生成的代码中 仍然使用了服务器端控件以及在DataBinding事件调用DataBinder Eval方法来完成数据的绑定工作 所有的数据绑定模板控件都使用了这样的机制来进行数据的单向绑定 在 NET 中新增了双向的数据绑定方式 主要用在GridView DetailsView FormView等数据容器控件中 结合DataSourceControl就可以非常轻松的完成数据的更新和提交工作 而不需要我们手工去遍历输入控件的值 那在这样的双向数据绑定中 ASP NET又是做了哪些工作 来为我们透明输入控件与字段的取值与对应关系 让我们可以在DataSouceControl中方便得到数据项修改前的值和修改后的值?下面就让我们一起来从一段页面代码开始吧

   : <asp:DetailsDataSouce ID= DetailsDataSouce runat= server >

   : </asp:DetailsDataSouce>

   : <asp:DetailsView ID= detailsView runat= server DefaultMode= Edit DataSourceID= DetailsDataSouce >

   : <Fields>

   : <asp:TemplateField>

   : <HeaderTemplate>

   : 电流:</HeaderTemplate>

   : <EditItemTemplate>

   : <asp:TextBox ID= textBox runat= server Text= <%# Bind( [电流a] ) %> ></asp:TextBox>

   : </EditItemTemplate>

   : </asp:TemplateField>

   : </Fields>

   : </asp:DetailsView>

  在一个页面中 定义了如上的一个DetailsView控件 为这个控件指定了ID为DetailsDataSource 的DataSouceControl控件 这个控件是我们自己定义的一个DataSourceControl 它返回的数据字段包括 ID 电流a 电压(v) 备注 名称] 我并没有设置DetailsView的AutoGenerateRows属性的值 默认情况下 它是为我们自动的生成这些字段的对应的数据显示和输入控件 除此之外 我们还另外添加了一个数据模板字段 在这个模板中指定了编辑模板 在编辑模板中我使用了<%# Bind( )%>这样的语法 将textBox 与 [电流a] 字段双向绑定起来

  为什么这里的字段都有一些特殊呢?因为我原先的意图是除了分析绑定语法以外 还要测试哪些特殊字符无法使用数据绑定语法来绑定数据的 这个在下篇文章中会具体介绍

  Bind与Eval不一样 这样的Bind并不Page或TemplateControl的一个方法 事实上我们应该把它当成一个关键字来看待 因为在ASP NET的双向数据绑定当中 并没有这样的一个函数存在 它的存在是只是告诉ASP NET动态编译页面类时 将这个语法编译成一定的代码格式 并生成一些函数代理来达到双向数据交流的目的

  那么这一段代码 动态编译生成的服务器代码又是如何的呢?让我们反编译动态程序集 里面会找到用于创建DetailsView的__BuildControldetailsView的私有方法 在这里会调用到一些其它内部方法 我们不要让这些方法来干扰我们的视线 直接找到创建如上模板字段的方法

   : [DebuggerNonUserCode]

   : private TemplateField __BuildControl__control ()

   :

   : TemplateField field = new TemplateField();

   : field HeaderTemplate = new CompiledTemplateBuilder(new BuildTemplateMethod(this __BuildControl__control ));

   : field EditItemTemplate = new CompiledBindableTemplateBuilder(new BuildTemplateMethod(this __BuildControl__control ) new ExtractTemplateValuesMethod(this __ExtractValues__control ));

   : return field;

   :

  这里首先把this __BuildControl__control 作为一个代理函数 用于创建头部模板的内容 也就是如上的 电流 字段标题 然后才是创建EditItemTemplate 这个模板又被一些的中介模板所代替 我们只需要来关心this __BuildControl__control 和__ExtractValues__control 即可 __BuildControl__control 是为了编辑数据字段时 将数据字段的值显示在输入控件中(输入控件的初始化 即字段值绑定到输入控件中) 而__ExtractValues__control 则是在提交数据时 要找出这个模板内所有的双向绑定字段 将这些字段的值以绑定字段名为Key 以输入控件的值为Value添加了IOrderedDictionary字典中 DetailsView等数据绑定控件调用这些委托代理来收集所有的被双向绑定的字段的最新的值 下面分别是两段函数的代码片段

   : [DebuggerNonUserCode]

   : private TextBox __BuildControl__control ()

   :

   : TextBox box = new TextBox();

   : box TemplateControl = this;

   : box ApplyStyleSheetSkin(this);

   : box ID = textBox ;

   : box DataBinding += new EventHandler(this __DataBinding__control );

   : return box;

   :

   : public void __DataBinding__control (object sender EventArgs e)

   :

   : TextBox box = (TextBox) sender;

   : IDataItemContainer bindingContainer = (IDataItemContainer) box BindingContainer;

   : if (this Page GetDataItem() != null)

   :

   : box Text = Convert ToString(base Eval( [电流a] ) CultureInfo CurrentCulture);

   :

   :

   : [DebuggerNonUserCode]

   : public IOrderedDictionary __ExtractValues__control (Control __container)

   :

   : TextBox box = (TextBox) __container FindControl( textBox );

   : OrderedDictionary dictionary = new OrderedDictionary();

   : if (box != null)

   :

   : dictionary[ [电流a] ] = box Text;

   :

   : return dictionary;

   :

  由上面的代码片段可以了解到 ASP NET动态编译器是将Bind语法拆分为两部分 绑定输出和读取输入控件值 绑定输出部分与前篇介绍的机制是完全一样的 并且也是调用DataBinder Eval方法来绑定数据 而读取输入控件值则是会根据页面上控件的类型 以及绑定的控件属性名称 生成一段强类型的控件属性读取代码 并将控件的值保存到dictionay中返回出去 而它全然不知 容器控件是如何将这些值合并起来传给对应的DataSouceControl控件的

  关于数据容器控件而何与DataSouceControl协同工作 并不是我们这里要分析的重点 但是我们可以简单的描述一下工作流程 以DetailsView的数据更新为例 大家通过反编译DetailsView的源码 会找到名称为HandleUpdate的私有方法 在这个方法里面会去处理数据项更新前的值(至于在Web环境中如何保存更新前的值 就需要靠ViewState的强大功能了) 和更新后的值(通过ExtractRowValues函数调用类似上面生成的__ExtractValues__control 代理函数来收集所有双向绑定字段的值存到NewValues里面) 并将他们分别保存在两个不同的IOrderedDictionary对象(OldValues NewValues)中 然后将调用对应的DataSouceView的Update方法 传入原字段值和新字段值和一些必须的参数 即可由我们通过重写DataSourceView的方法来得到所有需要更新字段的原始值和新值 并可以对比比较哪些字段值是否发生了变化 NBearDataSource控件就是利用了这样的机制来直接重DataSourceControl和DataSourceView来达到数据的全自动修改和添加方案的

  这里还有一点不得不说 在GridView DetailsView 并不一定需要使用<%# Bind( )%>语法来实现数据的双向绑定 他们的字段双向绑定可以通过BoundField及它的子控件代替模板控件的绑定语法 一样可以达到双向绑定的目的 简单但没有模板来得灵活 而在存取不同版本的字段值也是类似的机制

  由于这部分涉及到的都是动态和内部代码 如果没有亲自去阅读这些代码 估计还是很难理解 最后我们再来简单总结一下 ASP NET在模板中双向绑定字段 是通过<%# Bind() %>这样的语法 但是Bind我们更应该把它理解为是一个关键字 而不是一个函数 因为在ASP NET的控件中 并没有存在这个函数 ASP NET运行时在编译页面代码时 会把Bind关键字的代码当成两部分来编译 一部分是单向绑定代码 另一部分而是读取对应输入控件的绑定属性 以绑定字段名为Key 添加到IOrderedDictionary中收集返回给数据容器控件(GridView DetailsView FormView)等 让它们处理

cha138/Article/program/net/201311/13082

相关参考

知识大全 ASP.NET入门教程 7.2 ASP.NET 2.0的数据控件

ASP.NET入门教程7.2ASP.NET2.0的数据控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 ASP.NET入门教程 10.5.3 ASP.NET 2.0的新特性[2]

ASP.NET入门教程10.5.3ASP.NET2.0的新特性[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 ASP.NET入门教程 10.5.3 ASP.NET 2.0的新特性[1]

ASP.NET入门教程10.5.3ASP.NET2.0的新特性[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 ASP.NET入门教程 10.4.1 ASP.NET2.0中的编译

ASP.NET入门教程10.4.1ASP.NET2.0中的编译  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 ASP.NET入门随想

ASP.NET入门随想  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  著名品牌服务器控件(Con

知识大全 ASP.NET入门—语法介绍

ASP.NET入门—语法介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 ASP.NET数据库编程入门

ASP.NET数据库编程入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  因为Access并不

知识大全 ASP.NET编程入门随想之宽容

ASP.NET编程入门随想之宽容  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  古老的山谷中村民

知识大全 ASP.NET入门随想之抽象的力量

ASP.NET入门随想之抽象的力量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  小时看过一故事

知识大全 ASP.NET入门教程 13.4 结账

ASP.NET入门教程13.4结账  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb