熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 09:58:24  來源: .NET編程 

  一年前當本人拿到一個名叫TWIG的PHP程序時立即被作者OOP編程思想所折服很難想像TWIG中所有的功能(行事歷郵件個性化)均在一個PHP文件(indexphp)中執行完成這就得益於作者采用了程序代碼與頁面構架分離的思想但是我也看到盡管作者做了很大的努力但由於PHP的局限性程序並沒有真正做到代碼與構架的分離indexphp這個主文件由於要執行的功能太多所以其require的模塊文件相當之多至使整個文件依然顯得十分零亂本人愚昧當時花了半個月的時間才真正明白程序的構架分析代碼之苦無人能知啊(黯然淚下)
  
  TWIG程序對我此後的編程有著很大的影響但是即使這樣的作品依然沒有擺脫程序代碼與HTML代碼混雜的局面
  
  程序代碼與頁面構架的分離是WEB程序員多年的夢想在ASPNet出現之前無論是ASPPHP還是JSP程序代碼與HTML代碼都是混雜在一起的這種做法雖然在WEB技術初期受到贊揚但是隨著時間的的推移它的弊端是越來越明顯當程序代碼很長時HTML代碼與其混雜程序的可讀性變得很差讓人無法分清程序真正要表示的頁面構架
  
  而新技術ASPNet則通過Codebehind用戶控件(User Control)以及自定義控件(Custom Control)等方法真正做到了代碼的分離這是一個了不起的進步大家可以在本文中看到分離代碼後的ASPNet程序的結構是多麼的清晰
  
  飛刀借此地向大家演示一下它們的具體實現方法我們先看看要實現的功能
  
  為了便於理解這裡設計的頁面比較簡單頁面分為三個主要的部分頭部包含一個AdRotator控件(用於顯示廣告)與一個Label控件(用於顯示當前廣告鏈接地址)中部是一個登陸頁面包括兩個TextBox控件(分別用於輸入用戶名與密碼)一個Label控件(顯示登陸是否成功)與一個Button控件(作為提交按鈕)底部包含兩個Label控件(分別顯示當前用戶名與用戶權限)
  
  熟悉ASPNet的朋友馬上就會意識到頭部由於使用了AdRotator控件所以必定存在OnAdCreated事件以便在Label控件顯示相應鏈接而中部由於使用Button控件做為提交按鈕所以必定有一個OnClick事件處理
  
   CodeBehind
  
  首先我們就看看如何使用CodeBehind方法來實現代碼與頁面構架的分離下面給出的源程序是主ASPNet程序Exampleaspx
  
  <% @ Page Src=cs\EventHandlecs Inherits=Aspcn %>
  <html>
  <head>
  <title></title>
  </head>
  <body>
  <form runat=server>
  <asp:Panel id=Header runat=server>
  <asp:AdRotator id=ad AdvertisementFile=AdBanners\adxml 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 FontName=Arial ForeColor=red Text=游客 runat=server />
  
  權限<asp:Label id=lblPurview FontName=Arial Text= ForeColor=red runat=server />
  </asp:Panel>
  </form>
  </body>
  </html>
  
  例程中大家可以清楚地看到程序中不包含任何C#VBJavaScript來處理OnAdCreated與OnClick事件但是執行本程序程序能夠正常使用(如圖與圖)這便是使用CodeBehinde的結果事件處理已經被轉移到其它程序中定義執行請大家注意本例中第一行的信息
  
  <% @ Page Src=cs\EventHandlecs Inherits=Aspcn %>
  
  一般在ASPNet程序中Page指令都在設定本程序應當使用什麼語言(使用Language屬性)而本例中沒有出現Language屬性而是出現了兩個新的Page屬性Src與InheritsSrc屬性設定事件處理真正的代碼位置Inherits屬性則設定需要引入的類名可以看到本例中定義事件處理的文件是EventHandlecs我們來看看它的具體內容
  
  using System;
  using SystemData;
  using SystemDataSqlClient;
  using SystemWeb;
  using SystemWebUI;
  using SystemWebUIWebControls;
  using SystemWebUIHtmlControls;
  public class Aspcn : Page
  {
  //聲明Web Form中出現的控件
  public Label lblAdTextlblUserNamelblPurviewlblMsgShow;
  public TextBox tbUserNametbPasswd;
  public Button btnSubmit;
  public AdRotator ad;
  
  private string strConnString = server=(local)\\Feidao;database=aspcn;Trusted_Connection=yes;
  
  //處理Adrotator控件建立事件
  public void AdCreated(Object srcAdCreatedEventArgs e)
  {
  lblAdTextText = eAlternateText;
  }
  
  public void Submit_Click(Object senderEventArgs e)
  {
  SqlConnection MyConn = new SqlConnection(strConnString);
  MyConnOpen();
  string strUserNamestrPasswordstrSelect;
  strUserName = tbUserNameText;
  strPassword = tbPasswdText;
  strSelect = select * from bbs_user where id=+strUserName+ and password=+strPassword+;
  SqlCommand MyComm = new SqlCommand(strSelectMyConn);
  SqlDataReader dr = MyCommExecuteReader();
  if(drRead())
  {
  //登陸成功
  lblMsgShowText = 登陸成功;
  lblUserNameText = dr[id]ToString();
  lblPurviewText = dr[purview]ToString();
  }
  else
  {
  //登陸不成功
  lblMsgShowText = 登陸不成功;
  }
  drClose();
  MyConnClose();
  }
  }
  
  進行事件處理是定義在一個類中的(本例中是Aspcn注意大小寫)由於需要與Web Forms相關聯所以此類還必須繼承Page類
  
  分析程序大家可以看到程序中對事件的處理操作是與普通的未進行代碼分離的程序是一樣的並沒有什麼特別的地方(本人在程序中已經給出的相關注釋相信對大家理解程序有所幫助)
  
  使用CodeBehind技術後大家需要多寫一些代碼比如聲明控件等也許大家很不喜歡多寫這樣的代碼但是大家也必須看到使用了CodeBehind技術後主程序的可讀性大大增加了在Exampleaspx中相信大家很快就可以區分頁面構架的各個部分大家想想這些構架如果在其它技術是否能看得如此清楚?
  
   用戶控件(UserControl)
  
  CodeBehind技術真正實現了代碼與構架的分離比以前的技術前進了一大步但是它的缺陷也是顯而易見的比如主頁面中部那個登陸區如果內容很多HTML顯示代碼的依然會占用很大的區域程序的可讀性依然會降低
  
  ASPNet也提供了解決辦法這就是用戶控件
  
  用戶控件我們可以將其視為不用編譯的Server控件即然是控件那麼就肯定會遵從控件的使用方法我們將Exampleaspx中的每個Panel整體看成為一個控件因此Exampleaspx的主體部分通過使用用戶控件便可以減少為只有三行
  
  <% @ Register TagPrefix=aspcn TagName=Header Src=UserControls/Headerascx %>
  <% @ Register TagPrefix=aspcn TagName=Logon Src=UserControls/Logonascx %>
  <% @ Register TagPrefix=aspcn TagName=Footer Src=UserControls/Footerascx %>
  <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技術的結果是一樣的但是現在的ASPNet程序更加容易區分頁面構架了
  
  <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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.