当前位置:中国站长下载文章中心网页编程.NET编程 → ASP.NET设计控件净化网站语言(3)

ASP.NET设计控件净化网站语言(3)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 9:23:25
     现在来看复合控件本身。复合控件有两个类,用两个独立的VB源文件实现,分别是composite.vb和checkevent.vb。
  
  【composite.vb】
  
  Imports System
  Imports System.Web
  Imports System.Web.UI
  Imports System.Web.UI.WebControls
  Imports System.XML
  Imports System.Collections
  
  Namespace CustomControls
  Public Class Composite
  Inherits Control
  Implements INamingContainer
  Private _filename As String = "bad_words.XML"
  Private label As Label
  Private box1 As TextBox
  
  Public Property filename() As String
  Get
  Return _filename
  End Get
  Set
  _filename = value
  End Set
  End Property
  
  ' 以用户提交的文本内容为输入参数。如果用户提交的内容包含攻击性言辞,
  ' 则返回修改后的版本,
  ' 否则,直接返回原始的文本。
  Public Function CheckString(InputString as String) as string
  Dim alWordList As new ArrayList
  dim xmlDocPath as string = mappathsecure("bad_words.xml")
  dim xmlReader as XmlTextreader = new xmlTextReader(xmlDocPath)
  dim element as string
  dim output as string
  dim asterisks as string = "*************************"
  
  ' 将定义攻击性言辞的xml文件内容读入到一个ArrayList
  while (xmlReader.Read())
  if xmlReader.NodeType=xmlNodeType.Text then
  alWordList.Add(xmlReader.Value)
  end if
  end while
  xmlReader.Close()
  
  ' 检查用户提交的文本内容,将攻击性言辞替换为适当数量的星号
  For Each element in alWordList
  InputString=InputString.Replace(element,
  asterisks.substring(1, (element.length)))
  Next
  
  Return InputString
  
  End Function
  
  Public Property Text() As String
  Get
  ' 该方法首先检查ChildControlsCreated属性的当前值。如果该值是false,
  ' 则调用CreateChildControls方法
  EnsureChildControls()
  Return label.Text
  End Get
  Set
  EnsureChildControls()
  label.Text = value
  End Set
  End Property
  
  Public Event Check As CheckEventHandler
  
  Protected Overridable Sub OnCheck(ce As CheckEventArgs)
  RaiseEvent Check(Me, ce)
  End Sub
  
  '创建Composite控件的子控件
  Protected Overrides Sub CreateChildControls()
  
  Controls.Add(New LiteralControl("<h3>请在下面输入文字内容: "))
  
  '文本输入框
  Dim box1 As New Textbox()
  box1.Text = ""
  Controls.Add(box1)
  
  Controls.Add(New LiteralControl("</h3>"))
  
  '按钮
  Dim button1 As New Button()
  button1.Text = "提交"
  Controls.Add(New LiteralControl("<br>"))
  Controls.Add(button1)
  
  ' 将一个事件句柄加入新创建的按钮对象
  AddHandler button1.Click, AddressOf Me.ButtonClicked
  
  Controls.Add(New LiteralControl("<br><br>"))
  label = New Label()
  label.Height = Unit.Pixel(50)
  label.Width = Unit.Pixel(500)
  label.Text = ""
  Controls.Add(label)
  End Sub
  
  Protected Overrides Sub OnPreRender(e As EventArgs)
  CType(Controls(1), TextBox).Text = ""
  End Sub
  
  Private Sub ButtonClicked(sender As [Object], e As EventArgs)
  OnCheck(New CheckEventArgs(CType(Controls(1), TextBox).Text,
  CheckString(CType(Controls(1), TextBox).Text)))
  End Sub
  End Class
  End Namespace
  
    上面代码的主要任务是:
  
    ⑴ 首先导入必要的名称空间,声明当前类所属的名称空间。
  
    ⑵ 接下来定义Composite的主体。Composite从最基本的Control类继承,另外还要实现INamingContainer接口。INamingContainer接口允许Composite控件将事件转发到它的Button子控件。
  
    ⑶ 用CreateChildControls方法(而不是OnInit或构造函数)创建子控件。
  
    ⑷ Composite控件没有显露出Button子控件的Click事件。相反,它处理了Click事件,并抛出自定义事件Check。
  
    ⑸ Composite控件显露了下列公用属性:Text,即Label子控件的Text属性值;FileName,允许获取和设置定义攻击性词语的XML文件的名字
  
    ⑹ 主要的检查功能由CheckString方法实现,它的输入参数是一个文本字符串。CheckString方法从XML文件读取禁用的词语,放入一个数组列表(ArrayList),然后检查指定的字符串是否包含禁用的词语。所有“攻击性”的词语将被适当数量的“*”替代。
  
    ⑺ OnPreRender清除文本框子控件的文本。
  
    ⑻ 当用户点击按钮,ButtonClicked开始执行。ButtonClicked调用onCheck子过程,传入适当的参数(一个新建的CheckEventArgs对象,创建CheckEventArgs对象的参数是检查前和检查后的文本)。OnCheck随后触发一个事件,该事件将由.ASPx页面中的代码处理。
  
  【CheckEvent.vb】
  
  ' 包含定制事件数据类CheckEventArgs的代码.
  ' 另外还定义了Check事件的事件句柄
  Imports System
  Namespace CustomControls
  Public Class CheckEventArgs
  Inherits EventArgs
  Private _match As Boolean = False
  
  Public Sub New(string1 As String, string2 as String)
  If string1=string2 Then
  _match = True
  End If
  End Sub
  
  Public ReadOnly Property Match() As Boolean
  Get
  Return _match
  End Get
  End Property
  End Class
  
  Public Delegate Sub CheckEventHandler(sender As Object, ce As CheckEventArgs)
  End Namespace
  
    CheckEventArgs的构造函数是两个字符串,根据字符串的值设置相应的匹配标记_match。另外,上面的代码还定义了CheckEventHandler事件句柄。
  
    编写好上面的代码后,如果你没有安装IDE,用下面的命令执行编译即可:
  
  vbc /t:library /out:./bin/CustomControls.dll /r:System.dll /r:System.web.dll
  /r:System.drawing.dll /r:System.Data.dll /r:System.xml.dll *.vb
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。