国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET設(shè)計控件凈化網(wǎng)站語言

2024-07-10 12:54:57
字體:
供稿:網(wǎng)友
一、概述

  考慮一下這種情形:你為一個web網(wǎng)站寫了一個應(yīng)用程序,它的功能是接受用戶的輸入并將輸入內(nèi)容永久保存,例如保存到數(shù)據(jù)庫,另外還要在網(wǎng)站上顯示出用戶輸入的內(nèi)容,例如論壇就是一個很典型的例子。

  如果用戶來源很雜,必須考慮如何防止用戶提交和張貼攻擊性(或者色情的、庸俗的)的內(nèi)容。可能的解決方案包括:

   ⑴ 將用戶群限制到一個封閉的用戶團體,即要求用戶使用程序功能之前必須先注冊/登錄。這樣,由于每次提交的內(nèi)容都可以追查到提交者,用戶破壞網(wǎng)站規(guī)則的可能性就小了很多。如果有用戶做出了不應(yīng)該做的事,你就可以核實用戶身份,予以相應(yīng)的處理。

  ⑵ 在網(wǎng)站上發(fā)布用戶提交的內(nèi)容之前,先由管理員審閱。很多時候,由于人力資源有限,這個辦法不一定行得通。

  ⑶ 禁止用戶提交攻擊性內(nèi)容。這是最理想的解決辦法,把問題解決在起源。但具體應(yīng)該怎么實現(xiàn)呢?

  本文介紹的方案以一個復合控件為基礎(chǔ),利用一個xml文件來定義攻擊性詞語。我們將用vb.net編寫這個復合控件,用普通的文本編輯器和命令行編譯器(vbc)完成整個工程的構(gòu)建。

  在正式編寫控件之前,首先我們來簡單地回顧一下asp.net中控件的概念。本文出現(xiàn)的所有控件都是服務(wù)器控件,它們在服務(wù)器上運行,將html代碼發(fā)送到客戶端。要理解控件的分類,可以從控件是否嵌入到web表單頁面(因而采用按需編譯方式)或預(yù)先編譯的角度來觀察。微軟定義了下列asp.net服務(wù)器控件:html服務(wù)器控件,web服務(wù)器控件,驗證控件,用戶控件。

  前三種控件讀者應(yīng)該已經(jīng)比較熟悉了,對于開發(fā)者來說,它們是最簡單的控件類型,在asp.net中已經(jīng)由微軟為我們編寫好。用戶控件則有所不同。用戶控件是“包裝”成.ascx頁面形式的.aspx頁面,其他.aspx頁面可以通過注冊和實例化來調(diào)用用戶控件的功能。這是一種被寄予厚望的服務(wù)器端控件,對于asp/asp.net開發(fā)者來說,它代表著一大進步,特別地,現(xiàn)在編寫控件的語言已經(jīng)全面支持面向?qū)ο蠹夹g(shù)。

  asp.net用戶控件由一個或多個服務(wù)器控件、靜態(tài)html元素構(gòu)成,可以包含額外的代碼,每個用戶控件封裝一組特定的功能。用戶控件可以通過簡單地擴展現(xiàn)有服務(wù)器控件(控件組)得到,例如,帶有旋轉(zhuǎn)功能的圖形控件,在文本框中保存日期的日歷控件。



  二、開發(fā)復合控件

  控件要檢查用戶提交的內(nèi)容是否包含“攻擊性”詞語,攻擊性詞語由一個xml文件定義,xml文件的結(jié)構(gòu)如下:

<?xml version="1.0"? encoding="gb2312">
<words>
<word>詞語一</word>
<word>詞語二</word>
</words>
  本文的復合控件(composite)包含三個asp.net服務(wù)器控件:一個textbox控件,一個label控件,還有一個button控件。當用戶點擊button控件,composite檢查用戶提交的文本是否包含了xml文件中指定的詞語(xml文件的默認名字是bad_words.xml,通過一個自定義屬性定義),并拋出一個自定義事件。另外,composite控件還將它的label子控件的一個text屬性顯露成頂級屬性。

  復合控件可以有選擇地將子控件顯露成屬性,或者有選擇地將子控件的屬性和事件作為頂級屬性和事件顯露出來。當復合控件整合來自子控件的屬性時,它通常只是簡單地委托子控件執(zhí)行操作,如下面的例子所示:

// 將操作委托給標簽對象,標簽對象是一個
// system.web.ui.webcontrols.label的實例
public property text() as string
get
ensurechildcontrols()
return label.text
end get
set
ensurechildcontrols()
label.text = value
end set
end property
  我們需要一個文本輸入框讓用戶輸入內(nèi)容,一個按鈕來提交表單,還要一個向用戶反饋信息的文本標簽。下面我們來看看web表單的代碼,復合控件就是在這里實例化的:

【composite.aspx】

<%@ page language="vb" debug="false" trace="false" %>
<%@ register tagprefix="custom" namespace="customcontrols" assembly = "customcontrols" %>
<html>
<script language="vb" runat=server>
private sub checktext(sender as object, e as checkeventargs)
if e.match = false then
composite.text = "<h2>發(fā)布內(nèi)容請遵守本站規(guī)則!不得發(fā)布攻擊性言辭!</h2>"
else
composite.text = "你提交的內(nèi)容已通過檢查!"
end if
end sub
</script>

<body>

<h1>語言凈化控件實例</h1><br>
<form runat=server>
<custom:composite id = "composite" oncheck = "checktext"
filename = "bad_words.xml" runat = server/></form></body>
</html>
  上面的代碼首先注冊指定的復合控件。我們將把控件的代碼編譯成一個.dll文件,放入應(yīng)用的bin目錄,這是asp.net首先搜索的位置。在web表單構(gòu)成的用戶界面中,我們實例化了自定義控件,同時指定了:

  ⑴ 當控件拋出oncheck事件,執(zhí)行一個本地的子過程checktext。我們把復合控件的標簽的文本通過一個公用屬性顯露出來,標簽的內(nèi)容由oncheck事件句柄設(shè)置的另一個公用屬性決定。

  ⑵ 定義攻擊性詞語的xml文件的名字。

  ⑶ 另外,我們還定義了一個由復合控件調(diào)用的checktext子過程。


  現(xiàn)在來看復合控件本身。復合控件有兩個類,用兩個獨立的vb源文件實現(xiàn),分別是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

' 以用戶提交的文本內(nèi)容為輸入?yún)?shù)。如果用戶提交的內(nèi)容包含攻擊性言辭,
' 則返回修改后的版本,
' 否則,直接返回原始的文本。
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文件內(nèi)容讀入到一個arraylist
while (xmlreader.read())
if xmlreader.nodetype=xmlnodetype.text then
alwordlist.add(xmlreader.value)
end if
end while
xmlreader.close()

' 檢查用戶提交的文本內(nèi)容,將攻擊性言辭替換為適當數(shù)量的星號
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,
' 則調(diào)用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

'創(chuàng)建composite控件的子控件
protected overrides sub createchildcontrols()

controls.add(new literalcontrol("<h3>請在下面輸入文字內(nèi)容: "))

'文本輸入框
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)

' 將一個事件句柄加入新創(chuàng)建的按鈕對象
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
  上面代碼的主要任務(wù)是:

  ⑴ 首先導入必要的名稱空間,聲明當前類所屬的名稱空間。

  ⑵ 接下來定義composite的主體。composite從最基本的control類繼承,另外還要實現(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è)置定義攻擊性詞語的xml文件的名字

  ⑹ 主要的檢查功能由checkstring方法實現(xiàn),它的輸入?yún)?shù)是一個文本字符串。checkstring方法從xml文件讀取禁用的詞語,放入一個數(shù)組列表(arraylist),然后檢查指定的字符串是否包含禁用的詞語。所有“攻擊性”的詞語將被適當數(shù)量的“*”替代。

  ⑺ onprerender清除文本框子控件的文本。

  ⑻ 當用戶點擊按鈕,buttonclicked開始執(zhí)行。buttonclicked調(diào)用oncheck子過程,傳入適當?shù)膮?shù)(一個新建的checkeventargs對象,創(chuàng)建checkeventargs對象的參數(shù)是檢查前和檢查后的文本)。oncheck隨后觸發(fā)一個事件,該事件將由.aspx頁面中的代碼處理。

【checkevent.vb】

' 包含定制事件數(shù)據(jù)類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的構(gòu)造函數(shù)是兩個字符串,根據(jù)字符串的值設(shè)置相應(yīng)的匹配標記_match。另外,上面的代碼還定義了checkeventhandler事件句柄。

  編寫好上面的代碼后,如果你沒有安裝ide,用下面的命令執(zhí)行編譯即可:

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
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 望谟县| 开鲁县| 科技| 丹凤县| 大悟县| 中宁县| 新晃| 海南省| 平度市| 扬州市| 玛纳斯县| 平邑县| 海林市| 彭山县| 达尔| 岳阳市| 阿克陶县| 永寿县| 班戈县| 萝北县| 托克逊县| 辽中县| 台湾省| 雷山县| 丹江口市| 新沂市| 丰原市| 岳阳市| 临泽县| 三明市| 武鸣县| 自贡市| 西乌珠穆沁旗| 龙口市| 内乡县| 遂溪县| 乳山市| 北碚区| 浦江县| 砚山县| 南城县|