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文件夹下,覆盖原有的文件,如此一系列动作可以说是牵一发而动全身,
现在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的方式。
![1166230.html](https://i-blog.csdnimg.cn/blog_migrate/d4f61d5aab7a068d70ad8bc71fe6e195.jpeg)