位置:海鸟网 > IT > ASP.NET >

怎样自定义一个服务器端的控件

    
  大家知道在ASP.NET中微软为我们提供了大量的服务器端控件,包括HtmlControl 和WebControl。它们功能强大,为我们的编程提供了极大的方便。更重要的一点是它开放了对第三方控件的使用。这就使我们可以定制自己需要的服务器端控件。
  下面我就以一个集成化的上传组件来说明怎样自定义一个服务器端的控件,这个组件其实是HtmlInputFile、Button 和Label以及事件实现的集合。这个组件要达到的功能是要象已有的webcontrol一样,用一个设定了几个属性的标记就自动可以实现文件上传了,而不用再实现事件等。
  编写后端代码编译成一个dll
  //文件名称:WmjWebControls.cs
  using System.Drawing;
  using System.Web.UI.HtmlControls;
  using System.Web.UI.WebControls;
  using System;
  namespace Wmj
  {
   public class FileUpLoad : Panel
   {
   private HtmlInputFile htmlInputFile;
   private Button button;
   private Label label;
   public FileUpLoad() : base()
   {
   htmlInputFile=new HtmlInputFile();
   button=new Button();
   button.Text="上传";
   button.Click+=new EventHandler(this.Button_Click);
   label=new Label();
   label.Text="<font size=2>请选择上传文件的路径</font>";
   this.Controls.Add(htmlInputFile);
   this.Controls.Add(button);
   this.Controls.Add(label);
   this.Width=450;
   this.Height=30;
   this.BorderStyle=BorderStyle.Dotted;
   this.BorderWidth=1;
   }
   private void Button_Click(object sender, EventArgs e)
   {
   System.Web.HttpPostedFile postedFile=htmlInputFile.PostedFile;
   if(postedFile!=null)
   {
   try{
   string fileName=PathToName(postedFile.FileName);
   if(!fileName.EndsWith(Extension))
   {label.Text="You must select "+Extension+" file!"; return;}
   if(postedFile.ContentLength>int.Parse(FileLength))
   {label.Text="File too big!";return;}
   postedFile.SaveAs(SavePath+fileName);
   label.Text="Upload File Successfully!";
   return;
   }catch(System.Exception exc){label.Text=exc.Message;return;}
   }
   label.Text="Please select a file to upload!";
   return;
   }
   private string savePath="";
   private string extension="";
   private string fileLength="0";
  //上传的文件保存在服务器上的位置默认为c:\ 这些属性一般都是在asp.net的标记中设置也可以在codebehind中设置
   public string SavePath
   {
   get
   {
   if(savePath!="") return savePath;
   return "c:\\";
   }
   set
   {
   savePath=value;
   }
   }
  //上传文件的最大长度 单位k 默认为1k
   public string FileLength
   {
   get
   {
   if(fileLength!="0") return fileLength;
   return "1024";
   }
   set
   {
   fileLength=(int.Parse(value)*1024).ToString();
   }
   }
  //上传文件的扩展名 默认为txt
   public string Extension
   {
   get
   {
   if(extension!="") return extension;
   return "txt";
   }
   set
   {
   extension=value;
   }
   }
   public string PathToName(string path)
   {
   int pos=path.LastIndexOf("\\");
   return path.Substring(pos+1);
   }
   }
  }
  ////////////////////////////////////////////////////////////////////////////////
  ////
  将这个文件编译成dl,l放在要使用位置的bin目录下面就可以在网站中通过
  <Wmj:FileUpLoad SavePath="E:\\" FileLength="3" Extension="txt" runat="server"/>
  使用这个组件了
  下面举个调用这个控件的例子
  <%@page language="C#"%>
  <!--注意下面这一句是必须的-->
  <%@ Register TagPrefix="Wmj" Namespace="Wmj" Assembly="WmjWebControls"%>
  <html>
  <head>
  </head>
  <body>
  <form enctype="multipart/form-data" runat="server">
  <Wmj:FileUpLoad SavePath="E:\\" FileLength="3" Extension="txt" runat="server"/>
  <!--怎么样使用就是这么简单有点一劳永逸的感觉了吧-->
  </form>
  </body>
  </html>
  有了这个例子的启发,大家再也不用担心asp.net的服务器控件太少了吧。