科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET设计控件净化网站语言

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文介绍的方案以一个复合控件为基础,利用一个XML文件来定义攻击性词语

作者:东方欲晓 来源:yesky 2007年11月8日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
现在来看复合控件本身。复合控件有两个类,用两个独立的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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章