惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

博客园 - aimar

常见的 Web 项目转换问题及解决方案(转载) 在VS2005 正确地创建、部署和维护由1.1迁移到ASP.NET 2.0 应用程序 ajax用户控件中读取session的问题 - aimar - 博客园 世界杯分组与赛程 可否在vs2005中开发asp.net1.1的项目? 试用了一下google的个性化主页 Asp.net WebControls基本概念 连接sql2005 SqlServer2000的xml功能 DotNet2.0中上传文件 - aimar - 博客园 Oracle相关资源 关于使用存储过程的一些好处以及注意事项 DataGrid生成序号列 - aimar - 博客园 asp.net常用函数 Asp.Net2.0编译模式 Asp.Net2.0的改变 数据库访问程序块的效率问题 Rss应用(二) 抽取Rss Rss应用(一) 创建rss
ASP.NET 2.0 Beta2中页面编译模型的变化
aimar · 2006-01-18 · via 博客园 - aimar

首先回到ASP.NET 1.1的“远古时代”,看看ASP.NET引擎是如何处理页面文件和Code-Behind文件的。

我们在页面文件的上方通常会看到这样一句声明:

<%@ Page CodeBehind="Default.aspx.cs" Inherits="WebApplication1.CDefault" %>

当我们在页面文件上加入一个新的ASP.NET控件时,VS.NET自动会在Code-Behind代码文件中增加一个protecte的对象声明,并在代码中使用和操作这个对象。VS.NET会时刻维护页面文件中的控件与代码文件中的控件对象声明之间的同步。

当我们编译站点时,VS.NET将所有Code-Behind文件编译在一起,生成一个位于/bin目录中的.dll文件。然后,我们将所有的页面文件和/bin部署到服务器上。当用户浏览页面文件时,ASP.NET引擎自动根据页面中的内容,生成一个.cs的类文件,并根据页面文件头部声明中的“Inherits”所指定的内容,让这个类从指定的父类继承下来。这样,页面就和后台代码文件中的内容通过“继承”的方式结合在了一起。

这种页面编译模型最大的问题,就是页面中的控件,必须时刻与Code-Behind中的控件对象声明保持同步,虽然开发人员“意识”不到这一点,但是如果VS.NET出错而未能同步,就会损坏这种通过“继承”来连接的关系。


OK,在ASP.NET 2.0 Beta1中,我们终于可以用更加优雅的方式来实现了页面文件和Code-Behind文件的分离和连接了。由于有了partial class这个新的语言特性,我们终于可以摆脱巧妙、但“笨拙”的继承连接关系。为了体现Beta1中后台代码文件的特点,我们干脆直接把后台代码文件叫Code-Beside文件。

在页面文件的顶端,会如下面所示范的这样做一个声明:

<%@ Page Language="C#" CompileWith="Default.aspx.cs" ClassName="Default_aspx" %>

注意,VS.NET在开发时不会给我们提供一个手段,把所有的Code-Beside文件都编译到/bin里面的一个.dll中。

部署时,我们直接把所有的页面文件和Code-Beside文件直接XCopy到服务器上。当用户浏览页面时,ASP.NET引擎自动根据页面上的内容,生成一个partial类,然后与Code-Beside中的partial类整合在一起,最后完成编译。这个编译过程(页面文件和Code-Beside)完全是在运行时动态完成的,如果我们修改了页面文件或者Code-Beside文件,都不需要做任何手工操作,ASP.NET引擎会自动在下次浏览时重新进行编译动作。

嗯,当然,很多人会觉得不爽,“为啥我要把后台代码文件也给部署上去呢?”所以,ASP.NET Beta1也提供了其他的编译部署方案,比如,把整个站点的所有内容,包括页面文件和Code-Beside文件统统编译成一个.dll,然后部署到服务器上。

最后,终于,我们可以来看看ASP.NET Beta2中,页面编译模型又发生了什么变化。

页面文件顶端的声明变成了如下所示:

<%@ Page CodeFile="Default.aspx.cs" Inherits="Default_aspx" %>

怎么样?看到“Inherits”,是不是怀疑又走回ASP.NET 1.1的老路了?对,也不对。

当使用VS.NET创建一个页面的时候,VS.NET会自动创建一个Code-Behind(我们重新用回Code-Behind这个词)文件,当我们在页面上增加一个控件的时候,VS.NET如同Beta1一样,并不会在Code-Behind中增加一个什么声明。但是,当我们编译站点的时候,VS.NET自动根据页面文件的内容,生成一个“临时中间”partial类,然后把这个partial类和Code-Behind中的partial类整合编译,最终生成一个位于/bin中的.dll文件。

部署时,我们如同ASP.NET 1.1中一样,把/bin和所有页面文件部署到服务器上。当用户浏览页面时,ASP.NET引擎根据页面内容生成一个类文件,然后根据文件头部声明的“Inherits”的值,让这个类文件从指定的父类继承下来,最后完成编译过程。

总之,Beta2的页面编译模型吸收了ASP.NET 1.1和ASP.NET 2.0 Beta1的优点,我们既可以把站点的所有后台代码编译好,然后和所有页面文件一起部署,也获得了Beta1中,开发时后台代码文件中不需要另外声明页面控件对象的好处。

当然,对于开发人员来说,这一切都是在“盖子”底下运作,我们不需要了解这些,就可以方便的进行开发。

微软会在11月份推出一个新的社区技术预览版(CTP),将会体现所有的这些变化。Beta2预计会在明年年初发布,Beta2的设计基本上延续到RTM。

更加详细的信息,请参考MSDN上的这篇文章