具體錯(cuò)誤詳情呢?調(diào)用什么是時(shí)候出錯(cuò)了?
創(chuàng)新互聯(lián)成立于2013年,先為斗門等服務(wù)建站,斗門等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為斗門企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
堆棧跟蹤呢?嘗試刪除所有編譯文件后再試試。
VB.NET是一種.NET編程語(yǔ)言,與之平行的是C#
VC++.NET
等.
net語(yǔ)言
ASP.NET
是一種使嵌入網(wǎng)頁(yè)中的腳本可由因特網(wǎng)服務(wù)器執(zhí)行的
服務(wù)器端
腳本技術(shù)。
簡(jiǎn)單地說(shuō)就是編寫網(wǎng)站的技術(shù)
,與之平行的是PHP,ASP等.
ASP.NET后臺(tái)代碼可用VB.NET
C#編寫.
一 概述
考慮一下這種情形 你為一個(gè)Web網(wǎng)站寫了一個(gè)應(yīng)用程序 它的功能是接受用戶的輸入并將輸入內(nèi)容永久保存 例如保存到數(shù)據(jù)庫(kù) 另外還要在網(wǎng)站上顯示出用戶輸入的內(nèi)容 例如論壇就是一個(gè)很典型的例子
如果用戶來(lái)源很雜 必須考慮如何防止用戶提交和張貼攻擊性(或者色情的 庸俗的)的內(nèi)容 可能的解決方案包括
⑴ 將用戶群限制到一個(gè)封閉的用戶團(tuán)體 即要求用戶使用程序功能之前必須先注冊(cè)/登錄 這樣 由于每次提交的內(nèi)容都可以追查到提交者 用戶破壞網(wǎng)站規(guī)則的可能性就小了很多 如果有用戶做出了不應(yīng)該做的事 你就可以核實(shí)用戶身份 予以相應(yīng)的處理
⑵ 在網(wǎng)站上發(fā)布用戶提交的內(nèi)容之前 先由管理員審閱 很多時(shí)候 由于人力資源有限 這個(gè)辦法不一定行得通
⑶ 禁止用戶提交攻擊性內(nèi)容 這是最理想的解決辦法 把問(wèn)題解決在起源 但具體應(yīng)該怎么實(shí)現(xiàn)呢?
本文介紹的方案以一個(gè)復(fù)合控件為基礎(chǔ) 利用一個(gè)XML文件來(lái)定義攻擊性詞語(yǔ) 我們將用VB NET編寫這個(gè)復(fù)合控件 用普通的文本編輯器和命令行編譯器(vbc)完成整個(gè)工程的構(gòu)建
在正式編寫控件之前 首先我們來(lái)簡(jiǎn)單地回顧一下ASP NET中控件的概念 本文出現(xiàn)的所有控件都是服務(wù)器控件 它們?cè)诜?wù)器上運(yùn)行 將HTML代碼發(fā)送到客戶端 要理解控件的分類 可以從控件是否嵌入到Web表單頁(yè)面(因而采用按需編譯方式)或預(yù)先編譯的角度來(lái)觀察 微軟定義了下列ASP NET服務(wù)器控件 HTML服務(wù)器控件 Web服務(wù)器控件 驗(yàn)證控件 用戶控件
前三種控件讀者應(yīng)該已經(jīng)比較熟悉了 對(duì)于開發(fā)者來(lái)說(shuō) 它們是最簡(jiǎn)單的控件類型 在ASP NET中已經(jīng)由微軟為我們編寫好 用戶控件則有所不同 用戶控件是 包裝 成 ascx頁(yè)面形式的 aspx頁(yè)面 其他 aspx頁(yè)面可以通過(guò)注冊(cè)和實(shí)例化來(lái)調(diào)用用戶控件的功能 這是一種被寄予厚望的服務(wù)器端控件 對(duì)于ASP/ASP NET開發(fā)者來(lái)說(shuō) 它代表著一大進(jìn)步 特別地 現(xiàn)在編寫控件的語(yǔ)言已經(jīng)全面支持面向?qū)ο蠹夹g(shù)
ASP NET用戶控件由一個(gè)或多個(gè)服務(wù)器控件 靜態(tài)HTML元素構(gòu)成 可以包含額外的代碼 每個(gè)用戶控件封裝一組特定的功能 用戶控件可以通過(guò)簡(jiǎn)單地?cái)U(kuò)展現(xiàn)有服務(wù)器控件(控件組)得到 例如 帶有旋轉(zhuǎn)功能的圖形控件 在文本框中保存日期的日歷控件
二 開發(fā)復(fù)合控件
控件要檢查用戶提交的內(nèi)容是否包含 攻擊性 詞語(yǔ) 攻擊性詞語(yǔ)由一個(gè)XML文件定義 XML文件的結(jié)構(gòu)如下
<?xml version= ? encoding= GB ><words><word>詞語(yǔ)一</word><word>詞語(yǔ)二</word></words>
本文的復(fù)合控件(Composite)包含三個(gè)ASP NET服務(wù)器控件 一個(gè)Textbox控件 一個(gè)Label控件 還有一個(gè)Button控件 當(dāng)用戶點(diǎn)擊Button控件 Composite檢查用戶提交的文本是否包含了XML文件中指定的詞語(yǔ)(XML文件的默認(rèn)名字是bad_words xml 通過(guò)一個(gè)自定義屬性定義) 并拋出一個(gè)自定義事件 另外 Composite控件還將它的Label子控件的一個(gè)Text屬性顯露成頂級(jí)屬性
復(fù)合控件可以有選擇地將子控件顯露成屬性 或者有選擇地將子控件的屬性和事件作為頂級(jí)屬性和事件顯露出來(lái) 當(dāng)復(fù)合控件整合來(lái)自子控件的屬性時(shí) 它通常只是簡(jiǎn)單地委托子控件執(zhí)行操作 如下面的例子所示
// 將操作委托給標(biāo)簽對(duì)象 標(biāo)簽對(duì)象是一個(gè)// System Web UI WebControls Label的實(shí)例Public Property Text() As StringGetEnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd Property
我們需要一個(gè)文本輸入框讓用戶輸入內(nèi)容 一個(gè)按鈕來(lái)提交表單 還要一個(gè)向用戶反饋信息的文本標(biāo)簽 下面我們來(lái)看看Web表單的代碼 復(fù)合控件就是在這里實(shí)例化的
【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 >發(fā)布內(nèi)容請(qǐng)遵守本站規(guī)則!不得發(fā)布攻擊性言辭?。?h > ElseComposite Text = 你提交的內(nèi)容已通過(guò)檢查! End IfEnd Sub </script>
<body>
<h >語(yǔ)言凈化控件實(shí)例</h ><br><form runat=server><Custom:Composite id = Composite OnCheck = CheckText filename = bad_words xml runat = server/></form></body></>?
上面的代碼首先注冊(cè)指定的復(fù)合控件 我們將把控件的代碼編譯成一個(gè) dll文件 放入應(yīng)用的bin目錄 這是ASP NET首先搜索的位置 在Web表單構(gòu)成的用戶界面中 我們實(shí)例化了自定義控件 同時(shí)指定了
⑴ 當(dāng)控件拋出OnCheck事件 執(zhí)行一個(gè)本地的子過(guò)程CheckText 我們把復(fù)合控件的標(biāo)簽的文本通過(guò)一個(gè)公用屬性顯露出來(lái) 標(biāo)簽的內(nèi)容由OnCheck事件句柄設(shè)置的另一個(gè)公用屬性決定
⑵ 定義攻擊性詞語(yǔ)的XML文件的名字
⑶ 另外 我們還定義了一個(gè)由復(fù)合控件調(diào)用的CheckText子過(guò)程
現(xiàn)在來(lái)看復(fù)合控件本身 復(fù)合控件有兩個(gè)類 用兩個(gè)獨(dú)立的VB源文件實(shí)現(xiàn) 分別是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
以用戶提交的文本內(nèi)容為輸入?yún)?shù) 如果用戶提交的內(nèi)容包含攻擊性言辭 則返回修改后的版本 否則 直接返回原始的文本 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文件內(nèi)容讀入到一個(gè)ArrayLishile (xmlReader Read())if xmlReader NodeType=xmlNodeType Text thenalWordList Add(xmlReader Value)end ifend whilexmlReader Close()
檢查用戶提交的文本內(nèi)容 將攻擊性言辭替換為適當(dāng)數(shù)量的星號(hào)For Each element in alWordListInputString=InputString Replace(element asterisks substring( (element length)))Next
Return InputString
End Function
Public Property Text() As StringGet 該方法首先檢查ChildControlsCreated屬性的當(dāng)前值 如果該值是false 則調(diào)用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
創(chuàng)建Composite控件的子控件Protected Overrides Sub CreateChildControls()
Controls Add(New LiteralControl( <h >請(qǐng)?jiān)谙旅孑斎胛淖謨?nèi)容: ))
文本輸入框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 )
將一個(gè)事件句柄加入新創(chuàng)建的按鈕對(duì)象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
上面代碼的主要任務(wù)是
⑴ 首先導(dǎo)入必要的名稱空間 聲明當(dāng)前類所屬的名稱空間
⑵ 接下來(lái)定義Composite的主體 Composite從最基本的Control類繼承 另外還要實(shí)現(xiàn)INamingContainer接口 INamingContainer接口允許Composite控件將事件轉(zhuǎn)發(fā)到它的Button子控件
⑶ 用CreateChildControls方法(而不是OnInit或構(gòu)造函數(shù))創(chuàng)建子控件
⑷ Composite控件沒有顯露出Button子控件的Click事件 相反 它處理了Click事件 并拋出自定義事件Check
⑸ Composite控件顯露了下列公用屬性 Text 即Label子控件的Text屬性值 FileName 允許獲取和設(shè)置定義攻擊性詞語(yǔ)的XML文件的名字
⑹ 主要的檢查功能由CheckString方法實(shí)現(xiàn) 它的輸入?yún)?shù)是一個(gè)文本字符串 CheckString方法從XML文件讀取禁用的詞語(yǔ) 放入一個(gè)數(shù)組列表(ArrayList) 然后檢查指定的字符串是否包含禁用的詞語(yǔ) 所有 攻擊性 的詞語(yǔ)將被適當(dāng)數(shù)量的 * 替代
⑺ OnPreRender清除文本框子控件的文本
⑻ 當(dāng)用戶點(diǎn)擊按鈕 ButtonClicked開始執(zhí)行 ButtonClicked調(diào)用onCheck子過(guò)程 傳入適當(dāng)?shù)膮?shù)(一個(gè)新建的CheckEventArgs對(duì)象 創(chuàng)建CheckEventArgs對(duì)象的參數(shù)是檢查前和檢查后的文本) OnCheck隨后觸發(fā)一個(gè)事件 該事件將由 aspx頁(yè)面中的代碼處理
【CheckEvent vb】
包含定制事件數(shù)據(jù)類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的構(gòu)造函數(shù)是兩個(gè)字符串 根據(jù)字符串的值設(shè)置相應(yīng)的匹配標(biāo)記_match 另外 上面的代碼還定義了CheckEventHandler事件句柄
編寫好上面的代碼后 如果你沒有安裝IDE 用下面的命令執(zhí)行編譯即可
lishixinzhi/Article/program/net/201311/15751
先把你生成的.dllCOPY到BIN目錄下,在要使用的文件中引用命名空間引用.
%@ import namespace="YASPNET"%