ASP.NET从1.1到2.0的变更要点

ASP.NET提供了两种组织代码的方式,不管是ASP.NET1.X还是ASP.NET2.0都是通用的
(1)内置代码分离
这是最基本的一种方式,感觉是为了和传统的ASP兼容才提出的。这种方式同样用于介绍ASP.NET知识点,例如建立一个WebCodeSeparated.aspx页面,可能的代码如下
WebCodeSeparated.aspx
</html>
<head>
<script ruant="server">
</script>
</head>
<body>
</body>
</html>

(2)页面布局和逻辑代码分离的文件,
   VS2003就采用的这种思想,例如上面的WebCodeSeparated.aspx可能为
WebCodeSeparated.aspx和
WebCodeSeparated.aspx.cs
为了关联两者关系,可以使用Codebehind和Inherits进行说明 
   在VS2005里,提供了parital关键字

现在把一个Label控件、一个TextBox控件和一个Button控件托放到WebCodeSeparated.aspx上,最后生成的Source类似如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="WebCodeSeparated.aspx.cs" Inherits="WebCodeSeparated" %>

WebCodeSeparated.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div>
    </form>
</body>
</html>

 WebCodeSeparated.aspx.cs

public partial class WebCodeSeparated : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "hello" + TextBox1.Text + "Welcome to ASP.NET2.0";
    }
}



那么这段代码有什么特点呢?
和ASP.NET1.1相比,这段代码有什么区别呢?
首先,Page指令由由CodeBehind="WebCodeSeparated.aspx.cs"改成了CodeFile="WebCodeSeparated.aspx.cs",为什么会有这样的改变呢?
  这是因为,用CodeBehind的文件是在运行前编译的,而在运行时,其中的逻辑源代码文件可以不再使用。这给页面的的布局带来了非常的不便,请看下面示例子:

<%@ Page Language="C#" AutoEventWireup="true" %>
 <script lauguage="c#" runat="server" >
Button1_Click()
{ Label1.Text = "hello" + TextBox1.Text + "Welcome to ASP.NET2.0";}
</script>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div>
    </form>
</body>
</html>

  这是单一的*.aspx文件,显示的结果将和上面的一样。但是现在我想更改问候,例如改成如下代码,相当于中文版

<%@ Page Language="C#" AutoEventWireup="true" %>
  <script lauguage="c#" runat="server" >
Button1_Click()
{ Label1.Text = "你好" + TextBox1.Text + "欢迎进入ASP.NET2.0";}
</script>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div>
    </form>
</body>
</html>
那么当使用ASP.NET1.1版本在运行时,完全没有问题,显示中文版的问候。

然而,在ASP.NET1.1里,一般都是页面布局和代码分离的,上面代码在用Visual Studio.NET2003开发时,更多的写成如下的形式
<%@ Page Language="C#" AutoEventWireup="false"  CodeBehind="*.aspx.cs"%>
  <body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" /></div>
    </form>
</body>
</html>
 

后台代码文件*.aspx.cs为
Button1_Click()
{ Label1.Text = "hello" + TextBox1.Text + "Welcome to ASP.NET2.0";}

在开发时,由于当我们运行时(使用快捷键F5),系统自动将*.aspx.cs编译为dll文件并放置在bin文件夹,然后供*.aspx使用,这样以后如果我们需要将该页面部署到远程主机,例如您申请了一个 www.aspxcool.com域名和虚拟主机,你的Internet Server Provider(网络服务供应商)可能给你一个ftp帐户让你把页面文件上传到某个给定的文件夹下(例如wwww目录下),此时你上传时,只要上传*.aspx和bin文件夹及其下面的dll文件就可以了,*.aspx.cs源代码完全不需要(当然上传页可以),所以你现在应该感觉到了,如果我需要改变输出的问候为中文,该怎么办呢?
直接更改*.aspx.cs里的代码为
Button1_Click()
{ Label1.Text = "你好" + TextBox1.Text + "欢迎进入ASP.NET2.0";}
可以吗?
当然不可以,事实上该源代码文件你可能都没有上传,你从何处更改,即使上传你更改了也不其作用。没有办法,您只好重新用VS.NET2003打开*.aspx,并修改*.aspx.cs的Button1_Click为中文版,然后再用VS.NET2003进行编译,最后把编译好的BIN下面的DLL文件再拷贝到服务商提供的wwww/bin文件夹下,覆盖原有的文件,如此一系列动作可以说是牵一发而动全身,特别是你部署类似blogs、Community Server这样的大的项目时,更是为了一点的改动而重新编译整个项目,非常的麻烦。

   现在ASP.NET2.0提供了CodeFile来改变这种情况,它可以使得*.aspx.cs也是在运行时动态编译。所以在上面的例子里,如果您使用页面布局和逻辑代码分离的形式,在你更改过WebCodeSeparated.aspx.cs里的源代码为中文版后,页面会在运行时进行显示。

在上面代码里使用了partial,那么时候了该关键字有什么好处呢
在ASP.NET1.1版本里,您应该知道,如果我们在WebForm1上放置了一个控件,例如ID为Button1的按钮则
*.aspx会做如下记录
<asp:Button  id="Button1" runat="server">

而*.aspx.cs会做如下记录
protected Button Button1 ;  //定义了一个Button类对象Button1

   由于这种关系,使得系统的维护变的非常困难,特别是在稍微复杂的应用程序中,改动一点有时需要重新编译整个项目。而且更为难办的是,如果你在程序里按照如下使用
*.aspx
protected Button Button1 ;  //定义了一个Button类对象Button1
而忘记在*.aspx定义Button1,系统还会提示
          “未将对象引用设置为实例”的错误   
为了解决这些问题,.NET2.0才提出了partial 关键字,它使得如下的使用是正确的
你在*.aspx里定义了一个按钮如
<asp:Button  id="Button2" runat="server">
这样您在*.aspx.cs里就可以直接使用Button2,不用再定义类似 Button Button2;这样的对象,系统通过paritial自动将Button2关联起来。所以提高了维护性

(3)AutoEventWireup的属性由"false"改为了false,也就是说VWD2005主要支持隐式的事件代理处理
private void InitializeComponent()
  {   
   this.SubmitBtn.Click += new System.Web.UI.ImageClickEventHandler(this.SubmitBtn_Click);
   this.Load += new System.EventHandler(this.Page_Load);this.Load += new System.EventHandler(this.Page_Load);
  }
现在VS更支持隐式的
也就是前面介绍的OnClick的方式。

posted @ 2005-12-26 11:25  启明星工作室  阅读(2129)  评论(5编辑  收藏  举报