LeavingMe.net

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

2008-01-14 00:19:00

ASP.NET提供了两种组织代码的方式,不管是ASP.NET1.X还是ASP.NET2.0都是通用的<!--dvnewsadbegin--><!--dvnewsadend-->

(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.PageLoad);this.Load += new System.EventHandler(this.PageLoad);

  }

现在VS更支持隐式的

也就是前面介绍的OnClick的方式。

[陈源](http://leavingme.cnblogs.com/) 2008-01-14 00:19 [发表评论](http://www.cnblogs.com/leavingme/archive/2008/01/14/1166230.html#Feedback)
comments powered by Disqus