ASP.Net中程序构架与程序代码的分离


  用户名:
  权限:
  每个控件包含有自已的显示代码以及相应的程序代码。
  我们可以将一些常用的功能制作成为固定的用户控件,当需要时,我们就可直接拿来使用,而不需要使用烦人的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 = new AdRotator();
  ad.AdvertisementFile = "AdBanners/ad.xml";
  ad.BorderWidth = 0;
  ad.AdCreated += new AdCreatedEventHandler(this.OnAdCreated);
  this.Controls.Add(ad);
  this.Controls.Add(new LiteralControl("
"+"当前广告链接为:"));
  //加入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("

     
登陆窗口
"));
  //添加MsgShow Label控件
  lblMsgShow = new Label();
  lblMsgShow.ForeColor = Color.Red;
  this.Controls.Add(lblMsgShow);
  this.Controls.Add(new LiteralControl("
用户名: "));
  //添加UserName与Passwd TextBox控件
  tbUserName = new TextBox();
  this.Controls.Add(tbUserName);
  this.Controls.Add(new LiteralControl("
密码: "));
  tbPasswd = new TextBox();
  tbPasswd.TextMode = TextBoxMode.Password;
  this.Controls.Add(tbPasswd);
  this.Controls.Add(new LiteralControl("
"));
  //添加BtnSubmit Button控件
  Button btnSubmit = new Button();
  btnSubmit.Text = "登陆";
  btnSubmit.Click += new EventHandler(this.Submit_Click);
  this.Controls.Add(btnSubmit);
  this.Controls.Add(new LiteralControl("
"));
  }
  //显示完毕
  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的程序内容:
  
  
  
  
  
  
  
  <header id="MyHeader" runat="server"></header>
  <logon id="MyLogon" runat="server"></logon>
  <footer id="MyFooter" runat="server"></footer>
  
  
  
  怎么样,相当简单明了吧。引用我们自定义的控件,也相当简洁,只需将Register指令的TagPrefix、Namespace、Assembly属性全部设定为aspcn。
  至此,ASP.Net中三种代码与页面构架分离的方法已经介绍完毕。
  三种方法各有优劣,本人比较倾向于使用用户控件与CodeBinde技术结合使用,因为他们均不需要编译,相对来说更容易使用,如果您要保护你的代码,自定义控件则当然是您最佳的选择。

本文转自
http://www.webdn.com/web_file/program/asp.net/0602080251/

你可能感兴趣的:(.net,Web,UI,asp.net,asp)