十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
具体错误详情呢?调用什么是时候出错了?
创新互联成立于2013年,先为斗门等服务建站,斗门等地企业,进行企业商务咨询服务。为斗门企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
堆栈跟踪呢?尝试删除所有编译文件后再试试。
VB.NET是一种.NET编程语言,与之平行的是C#
VC++.NET
等.
net语言
ASP.NET
是一种使嵌入网页中的脚本可由因特网服务器执行的
服务器端
脚本技术。
简单地说就是编写网站的技术
,与之平行的是PHP,ASP等.
ASP.NET后台代码可用VB.NET
C#编写.
一 概述
考虑一下这种情形 你为一个Web网站写了一个应用程序 它的功能是接受用户的输入并将输入内容永久保存 例如保存到数据库 另外还要在网站上显示出用户输入的内容 例如论坛就是一个很典型的例子
如果用户来源很杂 必须考虑如何防止用户提交和张贴攻击性(或者色情的 庸俗的)的内容 可能的解决方案包括
⑴ 将用户群限制到一个封闭的用户团体 即要求用户使用程序功能之前必须先注册/登录 这样 由于每次提交的内容都可以追查到提交者 用户破坏网站规则的可能性就小了很多 如果有用户做出了不应该做的事 你就可以核实用户身份 予以相应的处理
⑵ 在网站上发布用户提交的内容之前 先由管理员审阅 很多时候 由于人力资源有限 这个办法不一定行得通
⑶ 禁止用户提交攻击性内容 这是最理想的解决办法 把问题解决在起源 但具体应该怎么实现呢?
本文介绍的方案以一个复合控件为基础 利用一个XML文件来定义攻击性词语 我们将用VB NET编写这个复合控件 用普通的文本编辑器和命令行编译器(vbc)完成整个工程的构建
在正式编写控件之前 首先我们来简单地回顾一下ASP NET中控件的概念 本文出现的所有控件都是服务器控件 它们在服务器上运行 将HTML代码发送到客户端 要理解控件的分类 可以从控件是否嵌入到Web表单页面(因而采用按需编译方式)或预先编译的角度来观察 微软定义了下列ASP NET服务器控件 HTML服务器控件 Web服务器控件 验证控件 用户控件
前三种控件读者应该已经比较熟悉了 对于开发者来说 它们是最简单的控件类型 在ASP NET中已经由微软为我们编写好 用户控件则有所不同 用户控件是 包装 成 ascx页面形式的 aspx页面 其他 aspx页面可以通过注册和实例化来调用用户控件的功能 这是一种被寄予厚望的服务器端控件 对于ASP/ASP NET开发者来说 它代表着一大进步 特别地 现在编写控件的语言已经全面支持面向对象技术
ASP NET用户控件由一个或多个服务器控件 静态HTML元素构成 可以包含额外的代码 每个用户控件封装一组特定的功能 用户控件可以通过简单地扩展现有服务器控件(控件组)得到 例如 带有旋转功能的图形控件 在文本框中保存日期的日历控件
二 开发复合控件
控件要检查用户提交的内容是否包含 攻击性 词语 攻击性词语由一个XML文件定义 XML文件的结构如下
<?xml version= ? encoding= GB ><words><word>词语一</word><word>词语二</word></words>
本文的复合控件(Composite)包含三个ASP NET服务器控件 一个Textbox控件 一个Label控件 还有一个Button控件 当用户点击Button控件 Composite检查用户提交的文本是否包含了XML文件中指定的词语(XML文件的默认名字是bad_words xml 通过一个自定义属性定义) 并抛出一个自定义事件 另外 Composite控件还将它的Label子控件的一个Text属性显露成顶级属性
复合控件可以有选择地将子控件显露成属性 或者有选择地将子控件的属性和事件作为顶级属性和事件显露出来 当复合控件整合来自子控件的属性时 它通常只是简单地委托子控件执行操作 如下面的例子所示
// 将操作委托给标签对象 标签对象是一个// System Web UI WebControls Label的实例Public Property Text() As StringGetEnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd Property
我们需要一个文本输入框让用户输入内容 一个按钮来提交表单 还要一个向用户反馈信息的文本标签 下面我们来看看Web表单的代码 复合控件就是在这里实例化的
【posite aspx】
<%@ page language= vb debug= false trace= false %><%@ Register TagPrefix= Custom Namespace= CustomControls Assembly = CustomControls %><><script language= VB runat=server>Private Sub CheckText(sender As Object e As CheckEventArgs)If e Match = false ThenComposite Text = <h >发布内容请遵守本站规则!不得发布攻击性言辞!</h > ElseComposite Text = 你提交的内容已通过检查! End IfEnd Sub </script>
<body>
<h >语言净化控件实例</h ><br><form runat=server><Custom:Composite id = Composite OnCheck = CheckText filename = bad_words xml runat = server/></form></body></>
上面的代码首先注册指定的复合控件 我们将把控件的代码编译成一个 dll文件 放入应用的bin目录 这是ASP NET首先搜索的位置 在Web表单构成的用户界面中 我们实例化了自定义控件 同时指定了
⑴ 当控件抛出OnCheck事件 执行一个本地的子过程CheckText 我们把复合控件的标签的文本通过一个公用属性显露出来 标签的内容由OnCheck事件句柄设置的另一个公用属性决定
⑵ 定义攻击性词语的XML文件的名字
⑶ 另外 我们还定义了一个由复合控件调用的CheckText子过程
现在来看复合控件本身 复合控件有两个类 用两个独立的VB源文件实现 分别是posite vb和checkevent vb
【posite vb】
Imports SystemImports System WebImports System Web UIImports System Web UI WebControlsImports System XmlImports System Collections
Namespace CustomControlsPublic Class CompositeInherits ControlImplements INamingContainerPrivate _filename As String = bad_words xml Private label As LabelPrivate box As TextBox
Public Property filename() As StringGetReturn _filenameEnd GetSet_filename = valueEnd SetEnd Property
以用户提交的文本内容为输入参数 如果用户提交的内容包含攻击性言辞 则返回修改后的版本 否则 直接返回原始的文本 Public Function CheckString(InputString as String) as stringDim alWordList As new ArrayListdim xmlDocPath as string = mappathsecure( bad_words xml )dim xmlReader as XmlTextreader = new xmlTextReader(xmlDocPath)dim element as stringdim output as stringdim asterisks as string = *************************
将定义攻击性言辞的xml文件内容读入到一个ArrayLishile (xmlReader Read())if xmlReader NodeType=xmlNodeType Text thenalWordList Add(xmlReader Value)end ifend whilexmlReader Close()
检查用户提交的文本内容 将攻击性言辞替换为适当数量的星号For Each element in alWordListInputString=InputString Replace(element asterisks substring( (element length)))Next
Return InputString
End Function
Public Property Text() As StringGet 该方法首先检查ChildControlsCreated属性的当前值 如果该值是false 则调用CreateChildControls方法EnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd 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( <h >请在下面输入文字内容: ))
文本输入框Dim box As New Textbox()box Text = Controls Add(box )
Controls Add(New LiteralControl( </h > ))
按钮Dim button As New Button()button Text = 提交 Controls Add(New LiteralControl( <br> ))Controls Add(button )
将一个事件句柄加入新创建的按钮对象AddHandler button Click AddressOf Me ButtonClicked
Controls Add(New LiteralControl( <br><br> ))label = New Label()label Height = Unit Pixel( )label Width = Unit Pixel( )label Text = Controls Add(label)End Sub
Protected Overrides Sub OnPreRender(e As EventArgs)CType(Controls( ) TextBox) Text = End Sub
Private Sub ButtonClicked(sender As [Object] e As EventArgs)OnCheck(New CheckEventArgs(CType(Controls( ) TextBox) Text CheckString(CType(Controls( ) TextBox) Text)))End SubEnd ClassEnd 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 SystemNamespace CustomControlsPublic Class CheckEventArgsInherits EventArgsPrivate _match As Boolean = False
Public Sub New(string As String string as String)If string =string Then_match = TrueEnd IfEnd Sub
Public ReadOnly Property Match() As BooleanGetReturn _matchEnd GetEnd PropertyEnd Class
Public Delegate Sub CheckEventHandler(sender As Object ce As CheckEventArgs)End Namespace
CheckEventArgs的构造函数是两个字符串 根据字符串的值设置相应的匹配标记_match 另外 上面的代码还定义了CheckEventHandler事件句柄
编写好上面的代码后 如果你没有安装IDE 用下面的命令执行编译即可
lishixinzhi/Article/program/net/201311/15751
先把你生成的.dllCOPY到BIN目录下,在要使用的文件中引用命名空间引用.
%@ import namespace="YASPNET"%