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

ASP.NET 實現驗證碼功能的Web控件

2013-11-13 10:25:22  來源: .NET編程 

  的設計方式和設計理念和其他的如AspJspPhpPerl等都不一樣幾乎是完全的面向對象設計!代碼的復用就是其中差異較大的特點之一除了可以用Include以外還提供了比較有特點的Web控件包括Ascx形式和帶設計時支持的控件[本文屬於後者]為了熟悉這些新概念我自己寫了個Web控件
  
  在實際項目中運行使用良好以後要有時間我還將不斷改進
  
  ValidateCode控件的使用方法:
  
  第一步
  
  編譯我提供的原代碼 然後工具欄上 選擇添加/移除項 選中編譯好的dll文件
  
  第二步
  
  工具欄上就會多一個Web控件ValidateCode做好一個Web窗體開發界面上直接把控件拖到WebForm上就OK!
  
  第三步
  
  在該控件的GraphicOK事件中獲取驗證碼的字符信息用於和用戶錄入做比較!
  
  最後一步
  
  在網站的根目錄下建一個temp目錄(也可以自己指定目錄)用於存放驗證碼
  
  圖片不用擔心代碼會自動刪除無用的圖片!
  
  原代碼如下
  
  using System;
  using SystemWebUI;
  using SystemWebUIWebControls;
  using SystemComponentModel;
  using SystemIO;
  using SystemDrawing;
  using SystemDrawingDrawingD;
  using SystemDrawingImaging;
  
  namespace WebValidateCode
  {
  /// <summary>
  /// ValidateCode 的摘要說明
  /// 設計者:王海波
  /// </summary>
  ///
  public enum GraphicType
  {
  Jpg =
  Gif =
  Png =
  Bmp =
  }
  
  //[ToolboxBitmap(@D:\DotnetApp\ValidateCode\ValidateCodebmp) ] //設置控件在工具箱上的圖標
  public class ValidateCode : SystemWebUIWebControlsWebControl INamingContainer
  {
  private int pCodelen=;
  private int pChartWidth=;
  private int pChartHeight=;
  
  private GraphicType pChartType;
  
  private string pAuthenCode;
  
  private string pTempImageURLPath=/temp;
  private string pAuthenImageFullname;
  private string pAuthenImageFullURL;
  
  //生成校驗碼的變量 start
  private Bitmap validateImage;
  private Graphics g;
  //生成校驗碼的變量 End
  
  private TextBox txt=new TextBox();
  private SystemWebUIWebControlsImage img= new SystemWebUIWebControlsImage();
  
  #region 定義控件事件
  
  public delegate void GraphicCreated(object sender EventArgs e);
  public event EventHandler GraphicOK;  //在校驗圖片生成結束以後觸發
  
  protected virtual void OnGraphicOK(object sender EventArgs e)
  {
  if (GraphicOK != null)
  {
  //Invokes the delegates
  GraphicOK(sender e);
  }
  }
  
  #endregion
  
  #region 控件屬性
  
  //生成校驗碼的長度
  [Bindable(true)Browsable(true)Category(Appearance)DefaultValue(true)Description(需要驗證碼的長度建議在~位之間!)]
  public int CodeLength
  {
  get
  {
  return pCodelen;
  }
  
  set
  {
  pCodelen = value;
  }
  }
  
  //生成校驗碼的長度
  [Bindable(true)Browsable(true)Category(Appearance)DefaultValue(true)Description(生成驗證碼圖片的臨時存放路徑要求必須是網站下的虛擬目錄!)]
  public string TempImageURLPath
  {
  get
  {
  return pTempImageURLPath;
  }
  
  set
  {
  pTempImageURLPath = value;
  }
  }
  
  [Bindable(true)Browsable(true)Category(Appearance)DefaultValue(GraphicTypeJpg)Description(選擇生成校驗圖文件的類型(Jpg;Gif;Png;Bmp)!)]
  public GraphicType ChartType
  {
  get
  {
  return pChartType;
  }
  
  set
  {
  pChartType = value;
  }
  }
  
  
  //生成校驗碼圖片的寬度
  public int ChartWidth
  {
  get
  {
  return pChartWidth;
  }
  
  set
  {
  pChartWidth = value;
  }
  }
  
  //生成校驗碼圖片的高度
  public int ChartHeight
  {
  get
  {
  return pChartHeight;
  }
  
  set
  {
  pChartHeight = value;
  }
  }
  
  //需要生成的校驗碼
  public string AuthenCode
  {
  get
  {
  return pAuthenCode;
  }
  
  set
  {
  pAuthenCode = value;
  }
  }
  
  #endregion
  
  /// <summary>
  /// 將此控件呈現給指定的輸出參數
  /// </summary>
  /// <param name=output> 要寫出到的 HTML 編寫器 </param>
  protected override void Render(HtmlTextWriter output)
  {
  
  SystemWebUIWebControlsImage objImage;
  //TextBox objTxt;
  
  
  //繪制包含的控件
  objImage = (SystemWebUIWebControlsImage) Controls[];
  //objTxt = (TextBox) Controls[];
  
  if(pAuthenCode==null)
  pAuthenCode=GetValidateCode();
  
  OnGraphicOK(thisEventArgsEmpty );
  
  GetRandomImage(pAuthenCode);
  objImageImageUrl=pAuthenImageFullURL;
  
  objImageRenderControl(output);
  
  }
  
  /// <summary>
  /// 給控件添加子控件
  /// </summary>
  protected override void CreateChildControls(  )
  {
  
  //ControlsAdd(btn);
  ControlsAdd(img);
  //ControlsAdd(txt);
  }
  
  /// <summary>
  /// 控件Load時候屬性的初始化
  /// </summary>
  /// <param name=e></param>
  protected override void OnLoad(SystemEventArgs e)
  {
  EraseOldGraphic();  //刪除過期的圖片
  }
  
  /// <summary>
  /// 生成隨機的
  /// </summary>
  private void MakeRandomFileName()
  {
  string strRandName=DateTimeNowTicksToString()+jpg;
  pAuthenImageFullname=thisPageMapPath(TempImageURLPath)+@\+strRandName;
  pAuthenImageFullURL=TempImageURLPath+/+strRandName;
  }
  
  
  private void GetRandomImage(string strValidateCode)
  {
  //生成隨即圖片的全名和全URL
  MakeRandomFileName();
  
  validateImage = new Bitmap(pChartWidth pChartHeight PixelFormatFormatbppRgb); // FormatbppRgb);
  g = GraphicsFromImage(validateImage);
  
  gClear(ColorLightGray) ;
  
  //gDrawString(strValidateCode new Font(宋體FontStyleBold)new SolidBrush(ColorDarkRed)new PointF());
  
  for(int i=;i<strValidateCodeLength;i++)
  {
  Random r = new Random();
  PointF startPos=new PointF(rNext()+(rNext()*i )rNext() );
  
  gDrawString(strValidateCodeSubstring(i) new Font(宋體FontStyleItalic)new SolidBrush(ColorBlue)startPos);
  }
  
  
  //gFillRectangle(new LinearGradientBrush(new Point() new Point() ColorFromArgb()ColorFromArgb()));
  switch(pChartType)
  {
  case GraphicTypeJpg:
  
  validateImageSave(pAuthenImageFullname ImageFormatJpeg);
  break;
  
  case GraphicTypeGif:
  
  validateImageSave(pAuthenImageFullname ImageFormatGif);
  break;
  
  case GraphicTypePng:
  
  validateImageSave(pAuthenImageFullname ImageFormatPng);
  break;
  
  case GraphicTypeBmp:
  
  validateImageSave(pAuthenImageFullname ImageFormatBmp);
  break;
  
  default:
  validateImageSave(pAuthenImageFullname ImageFormatJpeg);
  break;
  
  }
  
  validateImageDispose();
  
  gDispose();
  
  }
  
  /// <summary>
  /// 動態從數字和字母組成的元素中動態選擇生成校驗碼
  /// </summary>
  private string GetValidateCode()
From:http://tw.wingwit.com/Article/program/net/201311/13574.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.