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在数据绑定方面的应用是众所周知的,不过技术在发展,当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()看似把问题简化了,其实把问题搞得更加神秘。

目录
相关文章
|
29天前
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
10 0
|
29天前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
92 0
|
8天前
|
Linux C# C++
【.NET Developer】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
本文介绍了如何使用VS2019和.NET框架创建一个Blazor应用,并将其部署到Azure应用服务。首先,Blazor是一个使用C#而非JavaScript构建交互式Web UI的框架,支持共享服务器和客户端应用逻辑,以及与Docker和Azure集成。任务包括创建Blazor项目,配置Dockerfile为Linux容器,本地测试,发布到Azure Container Registry (ACR),然后在Azure App Service for Container上部署。在部署过程中,需确保Docker设置正确,开启ACR的Admin访问权限,并监控镜像拉取和容器启动日志。
|
29天前
|
存储 测试技术 计算机视觉
高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据
高维数据惩罚回归方法:主成分回归PCR、岭回归、lasso、弹性网络elastic net分析基因数据
|
29天前
|
SQL 数据库
使用ADO.NET查询和操作数据
使用ADO.NET查询和操作数据
13 0
|
29天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
36 0
|
29天前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
120 0
|
29天前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
141 5
|
29天前
|
SQL 开发框架 .NET
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
80 0
|
29天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
82 0