明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

NET移植案例學(xué)習(xí):建造Web網(wǎng)站(4)

[摘要]LAME報告和驗證控件  在移植過程中,開發(fā)組決定修改數(shù)據(jù)輸入頁以充分發(fā)揮ASP .NET檢驗控件的優(yōu)勢,并降低現(xiàn)存代碼的復(fù)雜度。當(dāng)用戶想提交一個LAME報告時,他們在點擊錯誤對話框(幫助文檔的反饋鏈接)上的LAME按鈕,或者是工具欄上的Feedback按鈕之后,在Visual Studio .N...
LAME報告和驗證控件

  在移植過程中,開發(fā)組決定修改數(shù)據(jù)輸入頁以充分發(fā)揮ASP .NET檢驗控件的優(yōu)勢,并降低現(xiàn)存代碼的復(fù)雜度。當(dāng)用戶想提交一個LAME報告時,他們在點擊錯誤對話框(幫助文檔的反饋鏈接)上的LAME按鈕,或者是工具欄上的Feedback按鈕之后,在Visual Studio .NET IDE中會見到一個頁面。為了將檢驗控件整合到LAME輸入頁,有必要重寫這些頁,并充分利用ASP .NET Web Form技術(shù)。

  Web Form檢驗控件提供了一套獨立于瀏覽器的校驗函數(shù),而不需要你在客戶應(yīng)用程序中用腳本語言寫代碼。這個控件可以在低版本的瀏覽器中使用(包括Microsoft Internet Explorer 4.0以前的版本和Netscape 5.0以前的版本),但需要利用服務(wù)器來檢查控件的值并返回結(jié)果。當(dāng)發(fā)現(xiàn)高版本的瀏覽器(Interne Explorer 4.0及其以后的版本和Netscape 5.0及其以后的版本)時,驗證的主要步驟是在向服務(wù)器發(fā)送數(shù)據(jù)之前,在客戶端完成的。在使用該版本瀏覽器時,如果被提交到服務(wù)器頁面企圖欺騙或繞過驗證規(guī)則,服務(wù)器端的驗證仍將進行。

  Figure 5.

  原來的LAME入口頁中的驗證邏輯的目標(biāo)很簡單:要求用戶在提交表單之前已經(jīng)在某些字段上填了值。盡管目標(biāo)很簡單,但它需要類似于圖5中的Jscript代碼的客戶端腳本代碼。

  除了需要在客戶端用腳本語言進行驗證,還要在服務(wù)器上增加驗證邏輯,以防止用戶繞過客戶端的驗證并提交無效數(shù)據(jù)。使用了ASP .NET驗證控件后,可以用Required,Compare和 RegularExpressionValidator等控件替換這些驗證邏輯。這樣不僅可以從頁面中刪掉很多Jscript代碼,而且可以利用RegularExpressionValidator控件來加強驗證。但當(dāng)發(fā)現(xiàn)了高版本的瀏覽器時,仍將向客戶端發(fā)送Jscript代碼,這樣就可以在提交到服務(wù)器進行驗證前進行客戶端驗證,。不同處在于開發(fā)組不需要編寫Jscript代碼,驗證控件會自動生成合適的代碼。

  當(dāng)提交漏洞報告或一般的LAME報告時,需要同時提交所使用產(chǎn)品的版本。在大多數(shù)情況下,用戶可以從下拉列表中選出版本號,而唯一的驗證就是檢查用戶是否選擇了一個版本號(參見圖6)。但在某些情況下,比如未列出所用的版本時,用戶需要手動輸入版本號。在這種情況下,可以用兩種格式來輸入版本號,在提交到服務(wù)器前將檢查格式是否正確。用來完成這種驗證的Jscript代碼可能很復(fù)雜,但如果使用RegularExpressionValidator控件,只要定義正確的表達規(guī)則就可以進行驗證了。下面這段代碼使用了RegularExpressionValidator控件,并設(shè)置了可以完成這種檢查的屬性。

<asp:RegularExpressionValidator id=txtBuildValueValidator

  runat="server" display="dynamic" controlToValidate="txtBuild"

  errorMessage="Also, please enter the Build Version in
       the following format: NN.NN.NN.NNNN "

  validationExpression="\d{2}.\d{2}.\d{2}.\d{4} \d{4}">##

</asp:RegularExpressionValidator>


  用于報告漏洞的Web Service

  這次移植還要增加報告漏洞的輸入容量,并用Web Service來實現(xiàn)漏洞報告。為了有效的發(fā)布有關(guān)Visual Studio .NET和.NET框架的信息,Microsoft建立了許多包含了例子和信息的Web站點。這些站點需要一種機制,允許用戶通過其它的Web站點報告漏洞,并將這些信息貯存在庫中。站點還要求能實現(xiàn)離線報告漏洞,這樣用戶可以一次將許多漏洞發(fā)送到站點。要想實現(xiàn)這些目標(biāo),我們應(yīng)該使用Web Service來完成報告漏洞的任務(wù)。

  為了便于分類管理漏洞報告,而且能讓合適的開發(fā)組看到報告,在一份漏洞報告中還需要提交許多其它數(shù)據(jù)(比如操作系統(tǒng)、語言、產(chǎn)品、地區(qū)等)。為了能讓客戶端應(yīng)用程序提供豐富、有用的接口,有必要向客戶端應(yīng)用程序提供這些信息。為了能適用于更多的程序,開發(fā)組決定使用XML來傳輸數(shù)據(jù)。

  為了簡化報告漏洞服務(wù)的使用,開發(fā)組開發(fā)了多種接口,并實現(xiàn)了用多種方法保存報告。一個接口要求用戶提供與漏洞報告數(shù)據(jù)有關(guān)的ID值,另一個接口允許客戶端應(yīng)用程序用字符串提交其它數(shù)據(jù)。如果采用后一種方式,漏洞報告服務(wù)將把字符串轉(zhuǎn)變?yōu)橄嚓P(guān)的ID,并通過漏洞報告組件完成驗證并保存。

  原來的用Visual Basic 6.0開發(fā)的漏洞報告組件使用ADO與客戶端程序進行數(shù)據(jù)交換。為了實現(xiàn)用XML傳輸數(shù)據(jù),我們可以使用ADO記錄的adPersistXML格式將記錄中的數(shù)據(jù)轉(zhuǎn)變?yōu)閄ML文檔。最后還要將得到的XML漏洞報告轉(zhuǎn)變?yōu)锳DO記錄,以便用Visual Basic 6.0的組件進行處理。

  開發(fā)小組決定在Visual Basic .NET中重新編寫報漏洞的類,這樣可以充分利用ADO.NET中基于XML的dataset。這樣做使得他們一方面可以方便地將數(shù)據(jù)以XML的形式提供給客戶端的應(yīng)用程序,同時,還可以使用Visual Basic .NET組件中簡單易用的對象接口與數(shù)據(jù)進行交互。

  一般說來,編寫轉(zhuǎn)換數(shù)據(jù)格式的代碼是一種更為安全的選擇。但考慮到我們遷移工程的主要目的是為了體驗一下新的技術(shù),采取這樣的轉(zhuǎn)換方法還是有一定的實際意義的。