<del id="dhfrq"></del>

    1. <tr id="dhfrq"></tr>
      成人午夜激情在线观看,国产精品一线天粉嫩av,99精品国产综合久久久久五月天 ,一卡2卡三卡4卡免费网站,国产高清在线男人的天堂,五月天国产成人AV免费观看,67194熟妇在线观看线路,成人无码潮喷在线观看
      現在位置:范文先生網>理工論文>計算機論文>ASP.Net中程序構架與程序代碼的分離 2

      ASP.Net中程序構架與程序代碼的分離 2

      時間:2022-08-06 10:33:46 計算機論文 我要投稿
      • 相關推薦

      ASP.Net中程序構架與程序代碼的分離 2

      一年前,當本人拿到一個名叫TWIG的PHP程序時,立即被作者OOP編程思想所折服,很難想像TWIG中所有的功能(行事歷、郵件、個性化)均在一個PHP文件(index.php3)中執行完成,這就得益于作者采用了程序代碼與頁面構架分離的思想,但是我也看到盡管作者做了很大的努力,但由于PHP的局限性,程序并沒有真正做到代碼與構架的分離,index.php3這個主文件由于要執行的功能太多,所以其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事件處理。

      1 CodeBehind


      首先我們就看看如何使用CodeBehind方法來實現代碼與頁面構架的分離,下面給出的源程序是主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>
      當前廣告鏈接:<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" />

      權限:<asp:Label id="lblPurview" Font-Name="Arial" Text="無" ForeColor="red" runat="server" />
      </asp:Panel>
      </form>
      </body>
      </html>

      例程中,大家可以清楚地看到程序中不包含任何C#、VB、JavaSc

      ript來處理OnAdCreated與OnClick事件,但是執行本程序,程序能夠正常使用(如圖2-1與圖2-2)。這便是使用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技術后,主程序的可讀性大大增加了。在Example1.aspx中相信大家很快就可以區分頁面構架的各個部分,大家想想這些構架如果在其它技術是否能看得如此清楚?
      (這里的程序只做演示用,呵呵,大家可不要抓我什么引號漏洞這些小辮子喲)

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

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


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

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

      nbsp;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的名字,以保證它在這個頁面的唯一性;TagName屬性是在定義一個類(class)的別名,由于用戶控件執行時是被CLR編譯成為類來執行的,所以就必須給本程序中每個用戶控件一個唯一的名字,以便于大家區分;Src屬性則是具體指出了使用的用戶控件的文件名(用戶控件均以.ascx結尾)。

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

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

      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>
      當前廣告鏈接:<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&nb

      sp;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:Label id="lblPurview" Font-Name="Arial" Text="無" ForeColor="red" runat="server" />

      每個控件包含有自已的顯示代碼以及相應的程序代碼。

      我們可以將一些常用的功能制作成為固定的用戶控件,當需要時,我們就可直接拿來使用,而不需要使用煩人的Crtl+C,Ctrl+V來"復制"、"粘貼"長長的一大堆代碼。

      用戶控件不僅做到了程序代碼與頁面構架的分離,而且還增加了代碼重用性。

      3 自定義控件(Custom Control)

      用戶控件是很不錯的選擇,但是由于每個用戶控件都是一個ascx文件,當這些控件很多時,它們的使用就顯得比較零亂。此時我們便想可不可以將一些比較相似的控件整合起來,在程序中只需要引用一次,便全部搞定。這是個很不錯的想法,我們把這個想法說得更加專業一些:"將多個類(class)導入同一個命名空間(namespace)"。呵呵,怎么樣,這句話是不是有點有耳熟?大家快去查一查Server控件的定義,是不是發現這句話是...

      我們下面就要接觸如何寫Server控件。編寫Server控件并不是一件輕松容易的事情,需要對.Net平臺有比較深的了解,適合于高級用戶,因此這里本人也不會具體描述Server控件的編寫步驟(要細細講這個,非得寫書不可)。請大家比較一下自定義控件源代碼與用戶控件的區別,作一些大致的了解:

      using System;
      using System.Data;
      using System.Data.SqlClient;
      using System.Drawing;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      namespace aspcn

      //首先是Header
      public class Header:Control,INamingContainer
      {
      private AdRotator ad;
      private Label lblAdText;

      protected override void CreateChildControls()
      {
      //加入AdRotator廣告控件
      ad = ne

      w AdRotator();
      ad.AdvertisementFile = "AdBanners/ad.xml";
      ad.BorderWidth = 0;
      ad.AdCreated += new AdCreatedEventHandler(this.OnAdCreated);
      this.Controls.Add(ad);


      this.Controls.Add(new LiteralControl("<br>"+"當前廣告鏈接為:"));
      //加入Label控件
      lblAdText = new Label();
      lblAdText.ForeColor = Color.Red;
      this.Controls.Add(lblAdText);
      }
      private void OnAdCreated(Object sender,AdCreatedEventArgs e)
      {
      this.lblAdText.Text = e.AlternateText;
      }
      }
      //接著是Logon
      public class Logon : Control,INamingContainer
      {
      private string strConnString = "server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes";
      private Label lblMsgShow;
      private TextBox tbUserName,tbPasswd;
      public String UserName
      {
      get
      {
      return tbUserName.Text;
      }
      set
      {
      tbUserName.Text = value;
      }
      }

      protected override void CreateChildControls()
      {
      //添加HTML標簽
      this.Controls.Add(new LiteralControl("<table><tr><td colspan=\"2\" align=\"center\"><b>登陸窗口</b></td></tr> <tr><td colspan=\"2\" align=\"center\">"));
      //添加MsgShow Label控件
      lblMsgShow = new Label(); 
      lblMsgShow.ForeColor = Color.Red;
      this.Controls.Add(lblMsgShow);
      this.Controls.Add(new LiteralControl("</td></tr><tr><td>用戶名:</td><td>"));
      //添加UserName與Passwd TextBox控件
      tbUserName = new TextBox();
      this.Controls.Add(tbUserName);
      this.Controls.Add(new LiteralControl("</td></tr><tr><td>密碼:</td><td>"));
      tbPasswd = new TextBox();
      tbPasswd.TextMode = TextBoxMode.Password;
      this.Controls.Add(tbPasswd);
      this.Controls.Add(new LiteralControl("</td></tr><tr><td>"));
      //添加BtnSubmit Button控件
      Button btnSubmit = new Button();
      btnSubmit.Text = "登陸";
      btnSubmit.Click += new EventHandler(this.Submit_Click);
      this.Controls.Add(btnSubmit);
      this.Controls.Add(new LiteralControl("</td></tr></table>"));
      }
      //顯示完畢
      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())
      {
      //登陸成功
      this.lblMsgShow.Text = "登陸成功";
      }
      else
      {
      //登陸不成功
      this.lblMsgShow.Text = "登陸不成功";
      }
      dr.Close();
      MyConn.Close();
      }
      }
      //最后是Footer
      public class Footer : Control,INamingContainer
      {
      private string _UserName,_Purview;

      public string UserName
      {
      get
      {
      return _UserName;
      }
      set
      {
      _UserName = value;
      }
      }

      public string Purview
      {
      get
      {
      return _Purview;
      }
      set
      {
      _Purview = value;
      }
      }

      public Footer()
      {
      _UserName = "游客";
      _Purview = "無";
      }

      protected override void CreateChildControls()
      {
      this.Controls.Add(new LiteralControl("用戶名:"));
      Label lblUserName = new Label();
      lblUserName.ForeColor = Color.Red;
      lblUserName.Font.Name = "Arial";
      lblUserName.Text = this.UserName;
      this.Controls.Add(lblUserName);
      //this.Controls.Add(new LiteralControl("nbsp;"));

      this.Controls.Add(new LiteralControl("權限:"));
      Label lblPurview = new Label();
      lblPurview.ForeColor = Color.Red;
      lblPurview.Font.Name = "Arial";
      lblPurview.Text = this.Purview;
      this.Controls.Add(lblPurview);
      }
      }
      }

      上面和程序是將需要實現的功能,全部導入了自定義控件。程序中可以看到,在aspcn命名空間中包含三個類(Header,Logon,Footer),這三個類正是構架三個主體部分。

      要使用自定義控件,還必須將原代碼進行編譯。

      csc /t:library /out:aspcn.dll /r:System.Data.dll,System.Web.dll,System.Drawing.dll 
      CustomControls.cs

      C#程序編譯指令的用法,本人在此也不再重復。需要注意的是編譯的文件名,必須與控件中namespace的名字一致。

      編譯后的dll,仍然不能使用,我們必須將其放到.Net平臺中最著名的目錄--/bin中,bin目錄(如果不存在,可以自行建立)存放的是當前虛擬目錄中所有使用自定義控件以及組件,CLR在執行ASP.Net程序時會自動搜索此目錄中的文件,以找到與ASP.Net程序相匹配的Namespace、Class 以及Assembly。

      當我們將程序編譯好的aspcn.dll放入/bin目錄后,這個自己編寫的Server控件便可以使用了。
      (需要聲明一下,由于編寫Server控件時不能使用Session等變量,以至無法做到兩個class之間的通信,因此在缺省狀態下Footer控件并不能像前面的程序一樣隨Session內容發生改變,不過可以通過普通操作Server控件的方法來操作相應的屬性達到相同的效果,此處為節約版面,未采用)
      下面再來看看主體Web Form的程序內容:

      <% @ Register TagPrefix="aspcn" Namespace="aspcn" Assembly="aspcn" %>
      <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>

      怎么樣,相當簡單明了吧。
      引用我們自定義的控件,也相當簡潔,只需將Register指令的TagPrefix、Namespace、Assembly屬性全部設定為aspcn。

      至此,ASP.Net中三種代碼與頁面構架分離的方法已經介紹完畢。

      三種方法各有優劣,本人比較傾向于使用用戶控件與CodeBinde技術結合使用,因為他們均不需要編譯,相對來說更容易使用,如果您要保護你的代碼,自定義控件則當然是您最佳的選擇。

      希望本文對您的編程有所幫

      助。


      【ASP.Net中程序構架與程序代碼的分離 2】相關文章:

      教學設計的基本構架08-17

      ASP.NET的網站新聞管理系統設計與實現 204-12

      淺議審判監督程序案件的立審分離08-12

      云存儲原理及發展趨勢_系統構架08-18

      分離的詩句08-12

      分離的句子11-19

      初中班主任程序教育208-16

      考試中的心理對策(2)08-16

      《答謝中書書 》 208-16

      證據在強制執行程序中的證明內容08-12

      主站蜘蛛池模板: 国产激情无码一区二区APP| 亚洲AV国产福利精品在现观看| 久久99精品久久久久久| 精品国产一区二区三区性色| 久久精品国产亚洲AV瑜伽| 美国又粗又长久久性黄大片| 久久婷婷五月综合色国产免费观看| 国产一国产精品免费播放| 国产在线98福利播放视频| 中文国产不卡一区二区| 狠狠色丁香婷婷综合尤物| 国产精品日韩中文字幕| 亚洲av色香蕉一二三区| 亚洲色欲色欲WWW在线丝| 福利网午夜视频一区二区| 久久精品av国产一区二区| 四虎库影成人在线播放| 熟女激情乱亚洲国产一区| 久久99热只有频精品6狠狠| 少妇精品视频一码二码三| 暖暖影院日本高清...免费| 亚洲中文字幕国产精品| 中文字幕一区二区三区麻豆| 国产 麻豆 日韩 欧美 久久| 亚洲精品成人福利网站| 亚洲天堂成人网在线观看| 国产农村妇女高潮大叫| 国产亚洲亚洲国产一二区| 国产成人亚洲精品狼色在线| 亚洲成年轻人电影网站WWW| 国产精品一二三中文字幕| 国产三级精品三级在线专区1| 草草浮力影院| 亚洲大尺度一区二区三区| 久久精品国产99久久六动漫| 国产成人人综合亚洲欧美丁香花| 乱人伦人妻中文字幕无码久久网| 亚洲制服无码一区二区三区| 国产成人亚洲精品狼色在线| 狠狠躁日日躁夜夜躁欧美老妇| 东方四虎在线观看av|