天天被操天天被操综合网,亚洲黄色一区二区三区性色,国产成人精品日本亚洲11,欧美zozo另类特级,www.黄片视频在线播放,啪啪网站永久免费看,特别一级a免费大片视频网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計(jì)算機(jī)論文>ASP.Net中程序構(gòu)架與程序代碼的分離

ASP.Net中程序構(gòu)架與程序代碼的分離

時(shí)間:2022-08-06 11:01:22 計(jì)算機(jī)論文 我要投稿
  • 相關(guān)推薦

ASP.Net中程序構(gòu)架與程序代碼的分離

一年前,當(dāng)本人拿到一個(gè)名叫TWIG的PHP程序時(shí),立即被作者OOP編程思想所折服,很難想像TWIG中所有的功能(行事歷、郵件、個(gè)性化)均在一個(gè)PHP文件(index.php3)中執(zhí)行完成,這就得益于作者采用了程序代碼與頁(yè)面構(gòu)架分離的思想,但是我也看到盡管作者做了很大的努力,但由于PHP的局限性,程序并沒有真正做到代碼與構(gòu)架的分離,index.php3這個(gè)主文件由于要執(zhí)行的功能太多,所以其require的模塊文件相當(dāng)之多,至使整個(gè)文件依然顯得十分零亂,本人愚昧,當(dāng)時(shí)花了半個(gè)月的時(shí)間,才真正明白程序的構(gòu)架,分析代碼之苦,無(wú)人能知啊(黯然淚下......)。

TWIG程序?qū)ξ掖撕蟮木幊逃兄艽蟮挠绊,但是即使這樣的作品,依然沒有擺脫程序代碼與HTML代碼混雜的局面。

程序代碼與頁(yè)面構(gòu)架的分離是WEB程序員多年的夢(mèng)想。在ASP.Net出現(xiàn)之前,無(wú)論是ASP、PHP還是JSP,程序代碼與HTML代碼都是混雜在一起的,這種做法,雖然在WEB技術(shù)初期受到贊揚(yáng),但是隨著時(shí)間的的推移,它的弊端是越來(lái)越明顯,當(dāng)程序代碼很長(zhǎng)時(shí),HTML代碼與其混雜,程序的可讀性變得很差,讓人無(wú)法分清程序真正要表示的頁(yè)面構(gòu)架。

而新技術(shù)ASP.Net則通過Codebehind、用戶控件(User Control)以及自定義控件(Custom Control)等方法真正做到了代碼的分離。這是一個(gè)了不起的進(jìn)步,大家可以在本文中看到分離代碼后的ASP.Net程序的結(jié)構(gòu)是多么的清晰。

為了便于理解,這里設(shè)計(jì)的頁(yè)面比較簡(jiǎn)單,頁(yè)面分為三個(gè)主要的部分,頭部包含一個(gè)AdRotator控件(用于顯示廣告)與一個(gè)Label控件(用于顯示當(dāng)前廣告鏈接地址);中部是一個(gè)登陸頁(yè)面,包括兩個(gè)TextBox控件(分別用于輸入用戶名與密碼)、一個(gè)Label控件(顯示登陸是否成功)與一個(gè)Button控件(作為提交按鈕);底部包含兩個(gè)Label控件(分別顯示當(dāng)前用戶名與用戶權(quán)限)。

熟悉ASP.Net的朋友,馬上就會(huì)意識(shí)到頭部由于使用了AdRotator控件,所以必定存在OnAdCreated事件以便在Label控件顯示相應(yīng)鏈接;而中部由于使用Button控件做為提交按鈕,所以必定有一個(gè)OnClick事件處理。

1 CodeBehind


首先我們就看看如何使用CodeBehind方法來(lái)實(shí)現(xiàn)代碼與頁(yè)面構(gòu)架的分離,下面給出的源程序是主ASP.Net程序--Example1.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="0" OnAdCreated="AdCreated" runat="server" /><br>
當(dāng)前廣告鏈接:<asp:Label id="lblAdText" ForeColor="red" runat="server" />
</asp:Panel>

<asp:Panel id="Logon" runat="server">
<table>
<tr><td colspan="2" align="center"><b>登陸窗口</b></td></tr>
<tr><td colspan="2" 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" />

權(quán)限:<asp:Label id="lblPurview" Font-Name="Arial" Text="無(wú)&quo

t; ForeColor="red" runat="server" />
</asp:Panel>
</form>
</body>
</html>

例程中,大家可以清楚地看到程序中不包含任何C#、VB、JavaScript來(lái)處理OnAdCreated與OnClick事件,但是執(zhí)行本程序,程序能夠正常使用(如圖2-1與圖2-2)。這便是使用CodeBehinde的結(jié)果,事件處理已經(jīng)被轉(zhuǎn)移到其它程序中定義執(zhí)行。請(qǐng)大家注意本例中第一行的信息:

<% @ Page Src="cs\EventHandle.cs" Inherits="Aspcn" %>

一般在ASP.Net程序中,Page指令都在設(shè)定本程序應(yīng)當(dāng)使用什么語(yǔ)言(使用Language屬性),而本例中沒有出現(xiàn)Language屬性,而是出現(xiàn)了兩個(gè)新的Page屬性:Src與Inherits。Src屬性設(shè)定事件處理真正的代碼位置,Inherits屬性則設(shè)定需要引入的類名?梢钥吹奖纠卸x事件處理的文件是EventHandle.cs,我們來(lái)看看它的具體內(nèi)容: 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中出現(xiàn)的控件
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();
}
}

進(jìn)行事件處理是定義在一個(gè)類中的(本例中是Aspcn,注意大小寫),由于需要與Web Forms相關(guān)聯(lián),所以此類還必須繼承Page類。

分析程序,大家可以看到程序中對(duì)事件的處理操作是與普通的未進(jìn)行代碼分離的程序是一樣的,并沒有什么特別的地方。(本人在程序中已經(jīng)給出的相關(guān)注釋,相信對(duì)大家理解程序有所幫助)

使用CodeBehind技術(shù)后,大家需要多寫一些代碼,比如聲明控件等,也許大家很不喜歡多寫這樣的代碼,但是大家也必須看到使用了CodeBehind技術(shù)后,主程序的可讀性大大增加了。在Example1.aspx中相信大家很快就可以區(qū)分頁(yè)面構(gòu)架的各個(gè)部分,大家想想這些構(gòu)架如果在其它技術(shù)是否能看得如此清楚?
(這里的程序只做演示用,呵呵,大家可不要抓我什么引號(hào)漏洞這些小辮子喲)

2 用戶控件(UserControl)
CodeBehind技術(shù)真正實(shí)現(xiàn)了代碼與構(gòu)架的分離,比以前的技術(shù)前進(jìn)了一大步,但是它的缺陷也是顯而易見的,比如主頁(yè)面中部那個(gè)登陸區(qū),如果內(nèi)容很多,HTML顯示代碼的依然會(huì)占用很大的區(qū)域,程序的可讀性依然會(huì)降低。

ASP.Net也提供了解決辦法,這就是用戶控件。


用戶控件我們可以將其視為不用編譯的Server控件。即然是控件,那么就肯定會(huì)遵從控件的使用方法。我們將Example1.aspx中的每個(gè)Panel整體看成為一個(gè)控件,因此Example1.aspx的主體部分通過使用用戶控件便可以減少為只有三行:

<% @ Register TagPrefix="aspcn" TagName="Header" Src="UserControls/Header.ascx" %>
<% @ Register TagPrefix="aspcn" TagName="Logon&q

uot; 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>

執(zhí)行這個(gè)程序,其運(yùn)行結(jié)果與使用CodeBehind技術(shù)的結(jié)果是一樣的,但是現(xiàn)在的ASP.Net程序更加容易區(qū)分頁(yè)面構(gòu)架了。

<aspcn:Header id="MyHeader" runat="server" />
<aspcn:Logon id="MyLogon" runat="server" />
<aspcn:Footer id="MyFooter" runat="server" />

這三行代碼,使用了三個(gè)用戶控件,這么少的代碼大家一眼就可以清楚的看到頁(yè)面被分為三個(gè)部分。

要使用用戶控件就必須使用Register指令,TagPrefix屬性定義是的一個(gè)Namespace的名字,以保證它在這個(gè)頁(yè)面的唯一性;TagName屬性是在定義一個(gè)類(class)的別名,由于用戶控件執(zhí)行時(shí)是被CLR編譯成為類來(lái)執(zhí)行的,所以就必須給本程序中每個(gè)用戶控件一個(gè)唯一的名字,以便于大家區(qū)分;Src屬性則是具體指出了使用的用戶控件的文件名(用戶控件均以.ascx結(jié)尾)。

用戶控件的使用與普通Server控件一樣:
<namespace:class ... runat="server" />
namespace表示定義的命名空間,class則是相應(yīng)的類名,具體的使用例子有:
<aspcn:Logon id="MyLogon" runat="server" />

下面是用戶控件顯示程序中所使用的用戶控件的具體內(nèi)容:

Header.ascx(Header用戶控件)

<Script Language="C#" Runat="Server">
private void AdCreated(Object src,AdCreatedEventArgs e)
{
lblAdText.Text = e.AlternateText;
}
</script>
<asp:AdRotator id="ad" AdvertisementFile="..\AdBanners\ad.xml" BorderWidth="0" OnAdCreated="AdCreated" runat="server" /><br>
當(dāng)前廣告鏈接:<asp:Label id="lblAdText" ForeColor="red" runat="server" />

Logon.ascx(Logon用戶控件)

<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.SqlClient" %>
<Script Language="C#" Runat="Server">
protected string strConnString = "server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes";
//定義UserControl的屬性
public string UserName
{
get
{
return tbUserName.Text;
}
set
{
tbUserName.Text = value;
}
}
public string Password
{
get
{
return tbPasswd.Text;
}
set
{
tbPasswd.Text = value;
}

}

//事件處理
private 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 = "登陸成功";
Session["UserName"] = dr["id"].ToString();
Session["Purview"] = dr["purview"].ToString();
}
else
{
//登陸不成功
lblMsgShow.Text = "登陸不成功";
}
dr.Close();
MyConn.Close();
}
</script>
<table>
<tr><td colspan="2" align="center"><b>登陸窗口</b></td></tr>
<tr><td colspan="2" 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>

Footer.ascx(Footer用戶控件)

<Script Language="C#" Runat="Server">
private void Page_Load(Object src,EventArgs e)
{
if(Session["UserName"]!=null)
{
lblUserName.Text = (string)Session["UserName"];
lblPurview.Text = (string)Session["Purview"];
}
}
</script>
用戶名:<asp:Label id="lblUserName" Font-Name="Arial" ForeColor="red" Text="游客" runat="server" />

【ASP.Net中程序構(gòu)架與程序代碼的分離】相關(guān)文章:

教學(xué)設(shè)計(jì)的基本構(gòu)架08-17

淺議審判監(jiān)督程序案件的立審分離08-12

云存儲(chǔ)原理及發(fā)展趨勢(shì)_系統(tǒng)構(gòu)架08-18

分離的詩(shī)句08-12

分離的句子11-19

證據(jù)在強(qiáng)制執(zhí)行程序中的證明內(nèi)容08-12

友誼分離作文08-17

畢業(yè)分離的句子02-20

友誼分離句子02-04

有關(guān)分離作文04-10