一年前
當本人拿到一個名叫TWIG的PHP程序時
立即被作者OOP編程思想所折服
很難想像TWIG中所有的功能(行事歷
郵件
個性化)均在一個PHP文件(index
php
)中執行完成
這就得益於作者采用了程序代碼與頁面構架分離的思想
但是我也看到盡管作者做了很大的努力
但由於PHP的局限性
程序並沒有真正做到代碼與構架的分離
index
php
這個主文件由於要執行的功能太多
所以其require的模塊文件相當之多
至使整個文件依然顯得十分零亂
本人愚昧
當時花了半個月的時間
才真正明白程序的構架
分析代碼之苦
無人能知啊(黯然淚下
)
TWIG程序對我此後的編程有著很大的影響
但是即使這樣的作品
依然沒有擺脫程序代碼與HTML代碼混雜的局面
程序代碼與頁面構架的分離是WEB程序員多年的夢想
在ASP
Net出現之前
無論是ASP
PHP還是JSP
程序代碼與HTML代碼都是混雜在一起的
這種做法
雖然在WEB技術初期受到贊揚
但是隨著時間的的推移
它的弊端是越來越明顯
當程序代碼很長時
HTML代碼與其混雜
程序的可讀性變得很差
讓人無法分清程序真正要表示的頁面構架
而新技術ASP
Net則通過Codebehind
用戶控件(User Control)以及自定義控件(Custom Control)等方法真正做到了代碼的分離
這是一個了不起的進步
大家可以在本文中看到分離代碼後的ASP
Net程序的結構是多麼的清晰
飛刀借此地向大家演示一下它們的具體實現方法
我們先看看要實現的功能
為了便於理解
這裡設計的頁面比較簡單
頁面分為三個主要的部分
頭部包含一個AdRotator控件(用於顯示廣告)與一個Label控件(用於顯示當前廣告鏈接地址)
中部是一個登陸頁面
包括兩個TextBox控件(分別用於輸入用戶名與密碼)
一個Label控件(顯示登陸是否成功)與一個Button控件(作為提交按鈕)
底部包含兩個Label控件(分別顯示當前用戶名與用戶權限)
熟悉ASP
Net的朋友
馬上就會意識到頭部由於使用了AdRotator控件
所以必定存在OnAdCreated事件以便在Label控件顯示相應鏈接
而中部由於使用Button控件做為提交按鈕
所以必定有一個OnClick事件處理
CodeBehind 首先我們就看看如何使用CodeBehind方法來實現代碼與頁面構架的分離
下面給出的源程序是主ASP
Net程序
Example
aspx
<% @ Page Src=
cs\EventHandle
cs
Inherits=
Aspcn
%>
<html>
<head>
<title></title>
</head>
<body>
<form runat=
server
>
<asp:Panel id=
Header
runat=
server
>
<asp:AdRotator id=
ad
AdvertisementFile=
AdBanners\ad
xml
BorderWidth=
OnAdCreated=
AdCreated
runat=
server
/><br>
當前廣告鏈接
<asp:Label id=
lblAdText
ForeColor=
red
runat=
server
/>
</asp:Panel>
<asp:Panel id=
Logon
runat=
server
>
<table>
<tr><td colspan=
align=
center
><b>登陸窗口</b></td></tr>
<tr><td colspan=
align=
center
><asp:Label id=
lblMsgShow
ForeColor=
red
runat=
server
/></td></tr>
<tr><td>用戶名
</td><td><asp:TextBox id=
tbUserName
runat=
server
/></td></tr>
<tr><td>密碼
</td><td><asp:TextBox id=
tbPasswd
TextMode=
Password
runat=
server
/></td></tr>
<tr><td><asp:Button id=
btnSubmit
Text=
登陸
OnClick=
Submit_Click
runat=
server
/></td></tr>
</table>
</asp:Panel>
<asp:Panel id=
Footer
runat=
server
>
用戶名
<asp:Label id=
lblUserName
Font
Name=
Arial
ForeColor=
red
Text=
游客
runat=
server
/>
權限
<asp:Label id=
lblPurview
Font
Name=
Arial
Text=
無
ForeColor=
red
runat=
server
/>
</asp:Panel>
</form>
</body>
</html>
例程中
大家可以清楚地看到程序中不包含任何C#
VB
JavaScript來處理OnAdCreated與OnClick事件
但是執行本程序
程序能夠正常使用(如圖
與圖
)
這便是使用CodeBehinde的結果
事件處理已經被轉移到其它程序中定義執行
請大家注意本例中第一行的信息
<% @ Page Src=
cs\EventHandle
cs
Inherits=
Aspcn
%>
一般在ASP
Net程序中
Page指令都在設定本程序應當使用什麼語言(使用Language屬性)
而本例中沒有出現Language屬性
而是出現了兩個新的Page屬性
Src與Inherits
Src屬性設定事件處理真正的代碼位置
Inherits屬性則設定需要引入的類名
可以看到本例中定義事件處理的文件是EventHandle
cs
我們來看看它的具體內容
using System;
using System
Data;
using System
Data
SqlClient;
using System
Web;
using System
Web
UI;
using System
Web
UI
WebControls;
using System
Web
UI
HtmlControls;
public class Aspcn : Page
{
//聲明Web Form中出現的控件
public Label lblAdText
lblUserName
lblPurview
lblMsgShow;
public TextBox tbUserName
tbPasswd;
public Button btnSubmit;
public AdRotator ad;
private string strConnString =
server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes
;
//處理Adrotator控件建立事件
public void AdCreated(Object src
AdCreatedEventArgs e)
{
lblAdText
Text = e
AlternateText;
}
public void Submit_Click(Object sender
EventArgs e)
{
SqlConnection MyConn = new SqlConnection(strConnString);
MyConn
Open();
string strUserName
strPassword
strSelect;
strUserName = tbUserName
Text;
strPassword = tbPasswd
Text;
strSelect =
select * from bbs_user where id=
+strUserName+
and password=
+strPassword+
;
SqlCommand MyComm = new SqlCommand(strSelect
MyConn);
SqlDataReader dr = MyComm
ExecuteReader();
if(dr
Read())
{
//登陸成功
lblMsgShow
Text =
登陸成功
;
lblUserName
Text = dr[
id
]
ToString();
lblPurview
Text = dr[
purview
]
ToString();
}
else
{
//登陸不成功
lblMsgShow
Text =
登陸不成功
;
}
dr
Close();
MyConn
Close();
}
}
進行事件處理是定義在一個類中的(本例中是Aspcn
注意大小寫)
由於需要與Web Forms相關聯
所以此類還必須繼承Page類
分析程序
大家可以看到程序中對事件的處理操作是與普通的未進行代碼分離的程序是一樣的
並沒有什麼特別的地方
(本人在程序中已經給出的相關注釋
相信對大家理解程序有所幫助)
使用CodeBehind技術後
大家需要多寫一些代碼
比如聲明控件等
也許大家很不喜歡多寫這樣的代碼
但是大家也必須看到使用了CodeBehind技術後
主程序的可讀性大大增加了
在Example
aspx中相信大家很快就可以區分頁面構架的各個部分
大家想想這些構架如果在其它技術是否能看得如此清楚?
用戶控件(UserControl) CodeBehind技術真正實現了代碼與構架的分離
比以前的技術前進了一大步
但是它的缺陷也是顯而易見的
比如主頁面中部那個登陸區
如果內容很多
HTML顯示代碼的依然會占用很大的區域
程序的可讀性依然會降低
ASP
Net也提供了解決辦法
這就是用戶控件
用戶控件我們可以將其視為不用編譯的Server控件
即然是控件
那麼就肯定會遵從控件的使用方法
我們將Example
aspx中的每個Panel整體看成為一個控件
因此Example
aspx的主體部分通過使用用戶控件便可以減少為只有三行
<% @ Register TagPrefix=
aspcn
TagName=
Header
Src=
UserControls/Header
ascx
%>
<% @ Register TagPrefix=
aspcn
TagName=
Logon
Src=
UserControls/Logon
ascx
%>
<% @ Register TagPrefix=
aspcn
TagName=
Footer
Src=
UserControls/Footer
ascx
%>
<html>
<head>
<title></title>
</head>
<body>
<form runat=
server
>
<aspcn:Header id=
MyHeader
runat=
server
/>
<aspcn:Logon id=
MyLogon
runat=
server
/>
<aspcn:Footer id=
MyFooter
runat=
server
/>
</form>
</body>
</html>
執行這個程序
其運行結果與使用CodeBehind技術的結果是一樣的
但是現在的ASP
Net程序更加容易區分頁面構架了
<aspcn:Header id=
MyHeader
runat=
server
/>
<aspcn:Logon id=
MyLogon
runat=
server
/>
<aspcn:Footer id=
MyFooter
runat=
server
/>
這三行代碼
使用了三個用戶控件
這麼少的代碼大家一眼就可以清楚的看到頁面被分為三個部分
要使用用戶控件就必須使用Register指令
TagPrefix屬性定義是的一個Namespace的名字
以保證它在這個頁面的唯一性;T
From:http://tw.wingwit.com/Article/program/net/201311/12154.html