鱼遇于池,池涸,相濡以沫,相鞠以湿,不若相忘于海。

while (alive) {
  object state = working & fighting & enjoying & living thanksgiving;
}
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[笔记]ASP.NET 2.0 Preview -- Building a Web Application

Posted on 2005-08-23 23:15  alittlefish  阅读(1291)  评论(1)    收藏  举报
What's New in 2.0 

  ·动态编译类。 
  ·简洁的代码后置文件。 
  ·更多新的服务器控件。 
  ·新声明的表达式句法。

注:本文是对ASP.Net 2.0 QuickStart TutorialBuilding a Web Application章节的总结归纳。因此,段落安排也依照其原始顺序陈述。

关于ASP.NET Pages

[原文译注]ASP.NET表单页面是一套基于公共语言运行时(CLR)的编程模型的框架体系,它可以用来作为服务器端动态的生成静态网页的技术实现方式,同时,它也可以构建强大的服务器端应用程序。作为ASP的一种代替物,在设计的时候就专门针对了它的前身的一些缺陷作了很大的突破。它特别提供了一些可重用的用户界面控件,并封装了一些常用的应用内容,使页面编程人员大大减少的代码的重复输入,同时也使页面代码更加条理清晰。

(本小节内容个人觉得没有太多必要作熬述,所以这里稍作忽略)

使用服务器控件

(本小节相对2.0与1.x几乎没有区别,在此忽略不做描述)

代码内置 vs 代码隐藏页

与1.x相同,2.0仍然提供两种页面元素与程序代码的组织方式:代码内置以及代码隐藏(本人更喜欢用代码后置称呼)。而2.0在这方面的改进体现在代码隐藏文件的变化。

首先,ASP.NET提供了一种改善了的代码隐藏页的运行时支持,以便可以简化aspx页面与code(cs, vb)文件之间的联系。在这种新的模式下,代码类被声明为一个partial类,这就使这个代码文件只需要关心页面处理逻辑,而不用在意控件的声明等等在1.x中显得很冗长丑陋的代码。这里需要注意的是,2.0在页面声明中,代码隐藏文件的定义属性由Codebehind改为CodeFile。

在页面间共享代码

虽然可以将代码通过内置或者后置的方式放在一个页面里,但是经常会出现需要在多个页面内共享一些代码的情况,一般我们只能用一种很低效的粘贴拷贝的方式来保持多个文件内的代码共享。
不过,ASP.NET2.0提供了一种很好的解决办法。

代码目录

就像页面可以在运行时动态被编译一样,现在任意的代码文件也可以(cs,vb文件)。ASP.NET2.0给我们介绍了一个叫APP_Code的目录,在这个目录下可以放置一些单独的代码文件,用来共享给当前应用程序中的多个页面文件。与1.x的所有代码都需要预编译以后生成dll放置于Bin目录下不同,在这里,所有代码文件可以在运行时被动态编译并被应用程序中的所有页面调用。同时,不同.Net语言的代码文件共存也在这个目录中变成了可能,而且我们可以把不同的语言实现的代码归在不同的子目录中,这样做的前提是在web.config中添加对子目录的定义。如下所示:

<configuration>
  
<system.web>
    
<compilation>
      
<codeSubDirectories>
        
<add directoryName="Subdirectory"/>
      
</codeSubDirectories>
    
</compilation>
  
</system.web>
</configuration>

当定义了子目录以后,其下的代码文件也会在运行时被动态编译。

Bin目录

2.0中bin目录的作用于1.x中一样,所有预编译的程序集都放在这个目录中,当页面文件需要调用这些程序集中的对象时,还是通过<%@ Import Namespace="MyCustomNamespace" %>的形式引入。

全局程序集缓存(GAC)

关于什么是GAC不是本文讨论的内容,如果希望了解GAC的内容请访问MSDN。这里需要介绍的是2.0中的另一个新特性:在web.config中添加对指定程序集的引用。

一般情况,ASP.NET应用程序已包含了对一部分GAC中的程序集的引用。就好像1.x中新建一个站点项目,引用中会自动包含几个常用的程序集的引用(比如System.Web、System.Data)。现在,如果在我们的页面中需要对一些未被自动引用的程序集进行访问,不一定需要在创建的项目文件中添加引用,直接在web.config中定义对指定程序集的引用也可以达到希望的目的。web.config文件如下:

<configuration>
   
<compilation>
      
<assemblies>
         
<add assembly="System.Data, Version=1.0.2411.0, 
                        Culture=neutral, 
                        PublicKeyToken
=b77a5c561934e089"/>
      </assemblies>
   
</compilation>
</configuration>

Web表单语法参考

aspx文件中除了对静态html的描述以外,同时支持多种服务器标记元素,以下一一做下介绍。

用以呈现内容的代码语法
ASP.NET中同样支持ASP中的<% %>以及<%= %>的语法来作为输出动态内容的方法。与ASP一样,这种标记的执行方式是从上到下的(Top-Down),服务器端载入aspx文件以后,会根据页面中这些标记的顺序依次将其中的内容解析成静态html元素。
<% for (int i=0; i<8; i++%>
     
<font size="<%=i%>"> Hello World! </font> <br>
<% }
 %>

代码声明块的语法
前面提到过ASP.NET代码的组织方式,其中的代码内置实际上就是将代码部分作为声明块置于aspx文件中。这种方式的标记语法为将包含逻辑处理方法以及事件函数放于<Script runat="server">的标记块中。与直接呈现内容的标记(<% %>)不同,在代码声明块中的声明的变量和方法会被编译成一个临时类,因为这个区别,ASP.NET中不允许在<% %>中声明方法。
<script language="C#" runat=server>
int subtract(int num1, int num2) {
  
return num1 - num2;
}

</script>

<%
  
  number 
= subtract(number, 1);
  
%>

服务器控件与HTML控件语法
两者有一个共同点,都需要在元素标签中加入runat="server"。服务器控件与HTML控件在ASP.NET1.x中已经得到广泛的使用,所以不作具体介绍了。
<asp:label id="Message" font-size=24 runat="server"/>

<span id="Message" style="font-size:24" runat="server"/>

数据绑定语法
ASP.NET从1.0开始就提供了数据绑定的方法,改变了原本显示数据必需要书写循环语句的方式。数据绑定的语法实现是以<%# %>这个标签来表示,此标签中的代码将在其所在控件的上级控件对象的DataBind方法被调用时被执行。
在ASP.NET2.0中提供了一种数据源控件,它的出现使上面说的这种绑定方式得到了进一步改善,可以在不用书写多余的代码,甚至无须调用DataBind方法的情况下简单的完成数据绑定的操作。
<Script runat="server">
void Page_Load(Object sender, EventArgs e) {
  ArrayList items 
= new ArrayList();

  items.Add(
"One");
  items.Add(
"Two");
  items.Add(
"Three");

  MyList.DataSource 
= items;
  MyList.DataBind();
}

</Script>

<asp:datalist id="MyList" runat=server>
  
<ItemTemplate>
    Here 
is a value: <%# Container.DataItem %>
  
</ItemTemplate>
</asp:datalist>

通用对象标签语法
在aspx文件也可以通过定义一个tag来声明一个变量!?这个我原来还真的不知道,居然1.x就已经支持这种语法了。前面说了,变量只有在代码声明块中定义,而不能在内容呈现语法标记中定义。而这种基于标签的定义方式或许也给代码组织提供了一定的弹性。
<object id="items" class="System.Collections.ArrayList" runat="server"/>

服务器端的注释语法
相对客户端注释,服务器端的注释使被注释的标记在解析过程中完全被服务器忽略。标记语法为<%-- comment --%>。
<%--
  
<asp:calendar id="MyCal" runat=server/>
    
<% for (int i=0; i<45; i++%>
             Hello World 
<br>
    
<% }
 %>
--%>

服务器端文件包含的语法
与ASP一样,ASP.NET仍然支持服务器端包含文件,语法依旧为<-- #Include File="Locaton.inc" -->。
<!-- #Include File="Header.inc" -->

<!-- #Include File="Footer.inc" -->

最后一个是2.0中新增的表达式语法
ASP.NET2.0提供了一种新的表达式语法,它可以在页面解析之前动态替换页面内的值。比如动态的将数据源控件的连接字符串的值替换为web.config中定义的内容,或者从一个资源文件中获取指定内容作为替换。关于这种新特性的介绍我会在后面的笔记中再做深入分析。
<asp:SqlDataSource ID="SqlDataSource1" ConnectionString='<%$ connectionStrings:Pubs %>' runat="server" SelectCommand="sp_GetAuthors" />
<asp:Label ID="Label1" Text='<%$ Resources: ExchRate, ConvertLabel %>' runat="server"/>

下一节:Performing Data Access