2009年4月14日 星期二

介紹 ASP.NET Application Services 1-2

RunPC165期:領先體驗微軟ASP.NET的「未來之路」(2)哇~原來搜尋引擎可以這麼親近我的站台

為自已的網站加入搜尋功能
學會利用ASP.NET Futures產生Sitemaps與將其提交至各搜尋引擎,這僅是讓搜尋引擎易於將我們的網站進行收錄與建立索引,如此一來卻僅僅對來自於搜尋引擎的訪客有用,如果要站內的搜索也透過網路搜索引擎(如:Google、Yahoo、MSN)來實現,以避免自己再開發站內的搜索引擎呢?早期是透過各搜尋引擎所提供搜尋方塊框的HTML直接嵌入網站的網頁內,請參考程式碼4,除提供搜尋引擎的搜尋功能外,亦可針對站內內容進行搜尋,各搜尋引擎的搜尋方塊框資訊,此方式在客製化上功能上較為簡略;後各搜尋引擎也可提供Search API,讓我們網站或程式透過呼叫Search API的方式完成搜尋功能;而ASP.NET Futures 本身已內鍵Windows Live Search的provider,只要透過簡單的配置檔設定、SearchDataSource控制項與簡易的程式即可完成站內搜尋功能,當然這種方式版面的配置會比採用搜尋方塊框的方式主控權會來得好許多。當然除了使用內鍵的WindowsLiveSearchProvider提供的功能,我也可以依WindowsLiveSearchProvider繼承SearchProviderBase 實做出自己延伸類別,如官方網站Enabling Search頁面上,提供自訂Yahoo和Index Server兩個自定義的provider,亦可依照此法實作出Google自定義的provider。當然你亦可以整合多家搜尋引擎搜尋回來的結果加以比對分析組合,產生真正符合你需求的搜尋功能。

程式4: Google、Yahoo、百度的搜尋方塊HTML


Windows Live站內搜尋實作
首先請至http://search.msn.com/developer申請取得一個appID;接著修改配置檔於< microsoft.web.preview>內加入< search enabled="true">< providers>< add name="WindowsLiveSearchProvider" type="Microsoft.Web.Preview.Search.WindowsLiveSearchProvider, Microsoft.Web.Preview" appID="MyAppID" siteDomainName="MySiteDomainName"/>< /providers>< /search>打開搜尋功能,加入Windows Live Search的Provider,其中MyAppID填入你申請的appID,而MySiteDomainName請填入你的網域名稱(筆者設定為asp.net)。最後新增一個aspx網頁,從工具箱中拖曵出一個TextBox當關鍵字欄位、一Button當觸發搜尋用,該Button_Click事件內輸入Me.SearchDataSource1.DataBind()、一GridView當呈現搜尋結果用、一SearchDataSource搜尋資料來源控制項,它與一般的資料來源控制項(如:ObjectDataSource、SqlDataSource)一樣,都可以繫結至DataList、GridView、Repeater等控制項,本範例繫結至GridView控制項,而且可以自動提供要呈現的資料,且因為繫結至此控制項的結果屬於SearchResult型別,它包含Title、URL和Description等屬性,實作程式碼如程式5所示,而執行後輸入關鍵字AJAX按下搜尋鈕,可搜尋asp.net站內AJAX的結果如圖七所示。

程式5: 搜尋頁面程式碼



圖七 實作Windows Live搜尋站台結果。


總結
本期筆者為各位介紹ASP.NET Futures內提供Application Services其中二項與搜尋引擎相關的服務與實作方式,Search Sitemaps可以幫助搜尋引擎更容易收錄站台,它提供以設定配置檔的方式來使用此服務,動態產生出站台的導航資訊檔,和動態從資料來源建立的Sitemaps方式,最後提交至各搜尋引擎,使搜尋引擎能探索遍我們整個站台,唯此僅對來自於搜索引擎的訪客有用,若希望也透過網路搜尋引擎來現實站內搜尋,則可借由Search Application Services內鍵的WindowsLiveSearchProvider或繼承SearchProviderBase 實做出自己延伸類別,將搜尋引擎整個嵌入我們的站台,完成站台的搜尋功能,使搜尋引擎不僅可索遍整個站台更進一步嵌入我們的站台。

參考資源

ASP.NET Futures快速教學網:http://quickstarts.asp.net/Futures/
ASP.NET Futures官方論壇網:http://forums.asp.net/1127.aspx
SiteMap官方網站:http://www.sitemaps.org

2009年4月12日 星期日

探討.NET Configuration Files 1-2

RunPC 112、113期:在.NET上保存應用程式設定(四)

應用程式配置檔案(Application Configuration Files)
應用程式配置檔案顧名思義它是用來配置應用程式特有的配置檔案,它的名稱和位置取決於應用程式的主應用程式 (Host),可以是下列其中一個:可執行檔裝載的應用程式、ASP.NET 裝載的應用程式、Internet Explorer 裝載的應用程式。
1、可執行檔裝載的應用程式
可執行檔裝載的應用程式它包含了視窗表單(Windows Froms)和主控台(Console-Base)的應用程式,可執行的主應用程式裝載的應用程式配置檔案位在與應用程式相同的目錄。配置檔案的副檔名為 .config,而其名稱為應用程式名稱(含.exe)加上.config。例如,稱為MyApp.exe 的應用程式可以和稱為 MyApp.exe.config 的配置檔案相關聯。
2、ASP.NET 裝載的應用程式
ASP.NET 裝載的應用程式它包含了ASP.NET Web 應用程式和ASP.NET Web服務,ASP.NET 配置檔案稱為 Web.config它位於虛擬目錄下的根節點或其子目錄下,在一個ASP.NET Web 應用程式中可以有多個 Web.config檔案,若您要求執行子目錄下的aspx頁面,它會先參考較靠近該aspx頁面下的web.config檔案內的設定值,若找不到相關設定值才會往上一層目錄參考其Web.Config檔案內的設定值直至虛擬目錄下的Web.Config檔案,若依舊沒有相關的設定值則會尋找電腦配置檔案內是否有提供其配置值,若皆沒有則出現圖一的錯誤。換言之,ASP.NET應用程式中頁面所參考的配置檔案是結合電腦配置檔案和各層目錄下的Web.Config檔案,若設定值有衝突時則以較靠近頁面的Web.Config設定值為主,請參考範例。
3、Internet Explorer 裝載的應用程式
如果裝載於 Internet Explorer 的應用程式具有配置檔案,這個檔案的位置會以下列語法在 標記中指定: 這個標記中,location 為配置檔案的 URL。這會設定應用程式基底。配置檔案必須位在與應用程式相同的 Web 網站。
範例:
1、 建立ASP.NET Web應用程式專案[ProWebConfig]。
2、 將專案中WebForm1.aspx更名為RootForm.aspx。
3、 在專案中建立Sub1與Sub2子資料夾,又在Sub1中建立Sub1_1子資料夾。
4、 在各子資料夾中加入新項目Web配置檔案(Web.config),在各配置檔中配置appSettings區段,而區段內加入一項目key為dsn,其值為Root_DSN、Sub1_DSN、Sub2_DSN、Sub1_1_DSN。
5、 在各子資料夾中加入Web Form,其名稱各為frmSub1.aspx、frmSub2.aspx、frmSub1_1.aspx。
6、 在各表單的Form_Load事件中加入Response.Output.WriteLine(ConfigurationSettings.AppSettings("dsn"))這行程式碼。
7、 在RootForm.aspx中加入三個HyperLink,其NavigateUrl屬性各指定為Sub1/frmSub1.aspx、Sub2/frmSub2.aspx、Sub1_1/frmSub1_1.aspx。
8、 執行測試,各表單取得的dsn鍵其值皆為最靠近表單的Web.config設定值。
9、 您可試將Sub1資料夾下的appSettings區段拿掉,再看frmSub1.aspx中取得該dsn鍵的值會是如何呢?
使用AppSettings來自訂配置檔案設定
當對各配置檔案做簡單說明後,接下接我們要為各位介紹配置檔案內的配置區段宣告與自訂的應用程式設定的關係,對它們的結構描述與各屬性所代表的意義來作簡單的介紹。一般我們會將對應用程式的喜愛設定和相關的狀態資訊存放在配置檔案的項目區段內,如:資料庫的連結設定等。其結構描述如下:

如前所述在所有配置檔案中皆是以為根節點,是故項目區段亦是包含在其內。項目的加入是表加入一個key/value成對的自訂的應用程式設定;項目是表來從您的應用程式中移除已在配置檔案階層架構較高層級中定義的設定,如:在應用程式配置檔案中移除您於電腦配置檔案中的設定;項目是表從您的應用程式中移除所有已在配置檔案階層架構較高層級中定義的設定。而我們可以利用項目來自訂的應用程式設定,是因為現存的電腦配置檔案中已對項目作宣告,若宣告的配置區段與配置區段內容沒有對應上則會發生如(圖一)的錯誤。您可參考下面電腦配置檔(machine.config)的部份片斷如下:

電腦配置檔案依舊是以為根節點,而項目是用來對配置區段和命名空間宣告,要特別注意的是當這個項目位於配置檔案中,則它必須是位於 項目的第一個子項目,其子項目請參考(表三)。

表三:下的子項目

在程式中我們可利用ConfigurationSettings.AppSettings(key)[註1]來取得該key所對應的value,若您要將在該區段中的Key/Value值列出,請參考下面的程式碼:

利用For Each取得區段中的每一個鍵的名稱,再利用ConfigurationSettings.AppSettings帶入鍵的名稱取得對應的配對值,字串組合後用Response.Output.WriteLine[註2]列印於網頁上,當完成使用AppSettings來自訂配置檔案設定後,接下來讓我們在應用程式配置檔案中自訂一個配置區段。

註1:請參考下面ConfigurationSettings類別的說明。
註2:此處您亦可利用Respose.Write將結果印於網頁上,但若要分行則必需於每個字串結尾中串接
字串以利分行,實為繁複,是故我們可利用在Global.asax的BeginRequest中加入Response.Output.NewLine = "
"該行程式碼,以後在該應用系統中即可使用Response.Output.WriteLine來輸出俱有分行效果的字串喔!
(2) 如何在專案中設定非預設的動態屬性設定(自訂的動態屬性設定)
在Form1表單屬性視窗上點DynamicProperties下之Advanced出現如圖六之對話盒,其列表皆為預設的動態屬性,所以我們在屬性視窗中與該對話盒內比對找尋沒有對應的屬性來成為這節的例子,恰好我們找到屬性視窗中有Location屬性,而Dynamic Properties對話盒沒有該設定視窗位址的選項,就讓我們舉Location屬性為非預設的動態屬性的例子,步驟如下:

(圖六)
1. 於app.config內輸入:


儲存,代表設定表單於瑩幕上的位址。
註:Location屬性內由X,Y所組成,表示表單Form1左上角點,是故該例子以保存表單的X,Y值(“Form1.X;Form1.Y)為例。
2. 於Sub New程序內模擬InitializeComponent內的作法利用AppSettingsReader類別來讀取設定檔的內容值;宣告x,y為整數,利用AppSettingsReader的GetValue方法,傳入二參數一為key值("Form1.X","Form1.Y")另一為傳回值所屬的資料型態為System.Int32再將資料型態轉為整數Integer,最後將表單的位置移至(x,y)這點上。
Dim MyConfigReader As System.Configuration.AppSettingsReader=New system.Configuration.AppSettingsReader()
Dim x,y As Integer
x = CType(MyConfigReader.GetValue("Form1.X",GetType(System.Int32)), Integer)
y = CType(MyConfigReader.GetValue("Form1.Y",GetType(System.Int32)), Integer)
Me.Location = New System.Drawing.Point(x, y)
注意:因為InitializeComponent是系統所產生的程序,不允許被修改。
3. 執行後卻發現未能如預期的將表單移置(x,y)這點上,甚至呈現的位置也都沒有改變,那是因為未將將StartPosition改為Manual,將StartPosition改為Manual再次執行,表單就可以移置正確的位置上。

這段我們模擬系統所產生的程式碼,來完成我們自訂動態屬性部分,重點是在如何利用AppSettingsReader類別來取得設定檔案的設定值,接下來讓我們思考當所開發的系統安裝後,使用者使用時我們總不可能請他手動去更改設定檔案部分,那該怎樣可以在系統執行時期時,提供如VS.Net IDE環境設定 (圖七) 般的使用者介面(UI)給使用者來設定,以防手動設定上造成不可預期的錯誤,這正是下面所要討論的。

(圖七)

(3) 如何在執行時期保留動態屬性值
此處我們會說明怎樣用.Net所提供的System.Xml名稱空間下的相關類別來維護XML(即app.config)的資料,及使用System.Reflection來找到設定檔的位置。
讓我們延續上面的例子使它可以在執行時期,保存視窗目前的位置(X,Y),待下次再次載入表單時,可以取回上次保存後的設定值,以便設定視窗位置。
1. 使用者介面:在表單上建立二個Label(Label1、Label2)、二個TextBox(txtX、txtY)來呈現目前視窗的位置、二按鈕(CmdSet、CmdSave),當按下CmdSet按鈕時來設定視窗位置;而當按下CmdSave時儲存視窗目前位置至設定檔案中, Label1、Label2的Text屬性分別設X:和Y:。
2. 在Sub New程序中之Me.Location = New System.Drawing.Point(x, y)下加入:
txtX.Text = CType(x, System.String)
txtY.Text = CType(y, System.String)
取得目前視窗啟動所在位置。
3. 於CmdSet_Click事件中加入以下程式碼,用來立即設定視窗位置。
Dim X, Y As Integer
X = CType(txtX.Text, System.Int32)
Y = CType(txtY.Text, System.Int32)
Me.Location = New System.Drawing.Point(x, y)
4. 於Form1_Move事件中加入以下程式碼,在視窗位置移動時txtX、txtY立即顯示視窗所在位置。
txtX.Text = CType(Me.Location.X, System.String)
txtY.Text = CType(Me.Location.Y, System.String)
5. 於CmdSave_Click事件中撰寫儲存目前位置至設定檔中。
利用Reflection來找設定檔的位置
Dim RA As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly
Dim StrCnfgPath As String = RA.Location & ".config"
Dim XmlDoc As New System.Xml.XmlDocument()
XmlDoc.Load(StrCnfgPath)
Dim AddNode As System.Xml.XmlNode
For Each AddNode In XmlDoc.Item("configuration").Item("appSettings")
If AddNode.Name = "add" Then
Select Case AddNode.Attributes.GetNamedItem("key").Value
Case "Form1.X"
AddNode.Attributes.GetNamedItem("value").Value = CType(Me.Location.X, System.String)
Case "Form1.Y"
AddNode.Attributes.GetNamedItem("value").Value = CType(Me.Location.Y, System.String)
End Select
End If
Next
XmlDoc.Save(StrCnfgPath)
RA.Location取得目前執行檔案的位置,而再加上".config"即前面說的佈署時設定檔的位置,而非開發時期用的app.config設定檔案。再來利用.Net操控XML的XmlDocument類別載入設定檔(StrCnfgPath),再找出每個在"configuration"下"appSettings"的節點,判斷節點的名稱是否為"add",如果是的話比較該節點的"key"值是否為"Form1.X"或"Form1.Y"(當然也可以是其它您所設定的key值),再將目前表單的位置存回它對應"key"的"value"值,最後存回設定檔中,即可完成儲存設定的動作。
註:在本例VS.Net IDE中按F5執行,儲存目前所在位置(X,Y),停下重新執行是否發現並未如預期的將設定值儲存下來呢?可別太快下結論以為這是系統Debug還是程式有謬誤喔!那是因為在開發環境中每次執行時會將app.config內容蓋回我們儲存的設定檔內,而我們在上面程式碼所抓取的StrCnfgPath卻是『執行檔名.exe.config』而非app.config設定檔案,是故只要在佈署時就不會有此問題。

結論:
這篇文章中讓我們體驗到微軟在VS.Net IDE內的一個體貼的設計(DynamicProperties),甚至讓我們不用撰寫一行程式碼就可以輕鬆設定預設的動態屬性,完成早期需要繁雜程序才可完成的動作,而自訂的動態屬性設定只要模擬學習系統產生的程式碼,即可以輕易完成設定,最後我們談到怎麼在執行時期保留動態屬性值,讓使用者可以簡易的完成保存應用程式設定值,而不至於要手動修改設定檔案。其中我們也說明了開發時期的app.config設定檔與佈署安裝的『執行檔名.exe.config』設定檔案的關係,希望該篇文章對讀者有所幫助。我們預計於下一篇文章中為各位介紹如何在.Net中更彈性的保存應用程式設定值,怎麼利用.Net上XML相關物件來操控自訂的XML設定檔案,如表(一)中選項配分中的階層關係……等,而非只是Key與Value的成對關係。

2009年4月4日 星期六

介紹 ASP.NET Application Services 1-1

RunPC165期:領先體驗微軟ASP.NET的「未來之路」(2)哇~原來搜尋引擎可以這麼親近我的站台


繼領先體驗微軟ASP.NET的「未來之路」第一篇介紹動態資料控制項(Dynamic Data Control;DDC)後,本期將為各位介紹透過ASP.NET Application Services拉近各搜尋引擎與我們網站間的距離,不僅表面拉近更要深入探索,使各搜尋引擎對我們網站瞭若指掌。或許各位正納悶著,這對我們的網站有什麼好處呢?現今全球企業、商家上網規模已有數百萬個網站,而且成長的速度是以每星期3000多個網站在增加,若你的網站未被搜尋引擎收錄,那你的網站就像是開在荒島的LV旗艦店,即使你有在好的產品,也難以銷售。讓搜尋引擎為你建立一條康莊大道(索引)指引你潛在的客戶來到你的網站認識你的公司、產品進而完成採購的動作,是現今網路行銷的一門顯學課程。

不教生不教死
台灣俗語有句話如此說:「教生教死,沒人教你做生意。」,這是筆者二年多前,在與某位資訊相關協會理事長聊天時,他對筆者說的一句話。當時許多網路公司業務僅著重在接網頁設計或架設網站的案子,卻忽略網路行銷這塊大餅,或將網路行銷與垃圾郵件行銷畫上等號。雖該理事長所成立的公司有開設相關課程,但卻對這關鍵點輕言帶過,因為「教生教死,沒人教你做生意。」;筆者不具教生教死的功夫,也沒教你做生意的本事,但卻可借由介紹微軟ASP.NET Application Services提供的技術,使各位對網站行銷的作法其一有基本的體驗與了解,更進一步了解到微軟對於此處的著墨。

微軟ASP.NET Application Services的簡介
它是微軟提供的一組全新的應用程式服務,包含下列三種應用程式服務:

 Search Sitemaps:它是ASP.NET Futures為幫助搜尋引擎更容易收錄站台的一個方式,可借由設定配置檔的方式來使用此服務,動態產生出站台的導航資訊檔,通知搜尋引擎,關於您網站中有哪些可供檢索的網頁,它是一份專為站台導航的特殊標準XML檔案。
 Search:能夠透過一組商業級的搜尋引擎API(Google、Live Search)或自訂的搜尋提供者,讓開發人員可以為自己的ASP.NET應用程式加入搜尋服務。
 Diagnostics:它可以補捉瀏灠器中JavaScript錯誤以及將它們回報給伺服器端ASP.NET網路服務程式碼,使其將客戶端的例外完整記錄於錯誤事件記錄或資料庫中,以利事後分析與偵錯,唯本篇將重心放於與搜尋引擎相關的部分,故此服務詳細介紹請參考相關資料。


在開始討論ASP.NET Application Services的Search Sitemaps前,我們先說明何為Sitemaps?

什麼是 Sitemaps?
二年多前由Google提出的Sitemaps格式在2006年11月15日被Yahoo!與Microsoft正式宣告支援採用,成為三大搜尋引擎的統一搜尋指引標準,在今年紐約的搜尋引擎大會中Ask.com也宣布加入這個標準協定,其這些目的是為了讓各搜尋引擎可以更容易且更精確的找到所要的網站,它是利用web crawl(網路搜尋)、Web Spider(網路蜘蛛),篩選出更符合使用者所需的搜尋結果,故網站管理者將可利用更簡單、整合性的方式提供內容及詮釋資料給搜尋引擎,對搜尋引擎而言,對比起從首頁進入尋找,Sitemaps可以讓搜尋引擎更有效簡易的紀錄、更新、收錄網站的頁面。雖然如此,但目前還沒有一個搜尋引擎準備放棄從首頁進行搜尋紀錄網頁的行為,Sitemaps的角色是可以輔助讓搜尋更有效率。
Sitemaps其實有點類似RSS或者Atom,只不過它不像RSS或Atom描述的是最近的更新內容,而是整個網站的地圖,主要用來描述網站URL及與各URL相關的其他中繼資料(上次更新日期、變更頻率,以及相對於網站中其他URL的重要性),可讓網站管理員易於通知搜尋引擎關於網站中有哪些可供檢索的網頁,使搜尋引擎能夠更有效地檢索該網站。但使用Sitemaps 通訊協定並不保證網頁會出現在搜尋引擎中,但它能夠協助網頁檢索器更完整地檢索您的網站。搜索引擎如Google是支援Sitemaps的,通過Google Webmaster Tools(以前叫做Google Sitemaps)你可以提交你的網站的Sitemaps,以便Google更好地索引你的網站。

Sitemaps XML格式
Sitemaps 通訊協定格式是一份專為站台導航的特殊XML標記所組成的檔案。檔案本身亦必須使用UTF-8編碼,且所有資料值都必須是實體逸出(註1),它必須,如程式碼1:

 以< urlset>標記做為起始開頭,並以< /urlset>標記做為結束結尾。
 指定< urlset>內的名稱領域(通訊協定標準),即http://www.sitemaps.org/schemas/sitemap/0.9。
 讓每個 URL 中包含一個< url> 項目做為母層 XML 標記。
 在每個 < url> 母層標記包含一個 < loc> 子層項目,為網頁的URL。

註1:如同所有的 XML 檔案一樣,下表所列字元的任何資料值 (包括 URL),都必須使用實體逸出碼。

實體逸出碼


程式1:XML Sitemaps格式範例


而< lastmod>、< changefreq>、< priority>標記為選擇性標記,其中< lastmod>為檔案的最後修改日期,採用W3C日期時間格式,可省略時間的部份;< changefreq>為網頁可能變更的頻率,分為always、hourly、daily、weekly、monthly、yearly、never七種頻率模式;< priority>為此URL的優先順序,只是相對於您網站上的其他 URL,其有效值的範圍為0.0~1.0,預設為0.5。
至此我們已了解何為Sitemaps與Sitemaps的格式,接下來讓我們來看一下ASP.NET Futures的作法。

ASP.NET Futures產生Sitemaps的作法
在ASP.NET Futures之前,如果要為所屬的ASP.NET網站增加Sitemaps,除第三方提供的工具外,一般有二種較常見的實作方法,一種是讀取Web.sitemap來產生Sitemaps檔案,另一種是借由讀取網站整個目錄檔案來產生Sitemaps檔案,筆者早期採用後者的方式,建立站台的Sitemaps。
而ASP.NET Futures也提供二種方式,其一是借由AspNetSiteMapSearchSiteMapProvider類別直接在配置檔內指定即可依Web.sitemap來產生Sitemaps,另一是借由繼承DynamicDataSearchSiteMapProvider類別覆寫DataQuery方法來動態產生我們要的Sitemaps,此二者類別皆是繼承自Microsoft.Web.Preview.Search.SearchSiteMapProviderBase基底型別。接下來讓我們看一下如何實作,首先,你還是需要有ASP.NET Futures開發環境(建置方式請參考RunPC 165期P205)後,新增一個網站,新網站範本如圖一請選擇建立ASP.NET Futures AJAX Web Site範本,該範本會自動加入Microsoft.Web.Preview.dll參考,如圖二所示,因為第一種實作方式是要借由AspNetSiteMapSearchSiteMapProvider類別來讀取Web.sitemap檔案來產生Sitemaps,所以接著在專案中加入網站的Web.sitemap檔案,緊接著於Web.config配置檔內加入程式2指定使用到的Provider與Provider名稱(FromWebsitemap)和它的Handler,即可透過http://xx.xx.xx/xx/SearchSiteMaps.axd?sitemap=FromWebsitemap,讀取我們網站的Web.sitemap來產生該網站Sitemaps,結果如圖三所示;眼尖的讀者可能發現到Sitemaps協議中標記為選擇性標記的< changefreq>、< priority>這二者都未出現,而< lastmod>僅出現在第一個節點是因為< lastmod>與< url>皆可自動產生,唯需有對應至該專案網頁才可自動取出最後修改日,此範例僅有Default.aspx網頁,故僅有此節點有最後修改時間,而此三者可於Web.sitemap檔中的siteMapNode中加入lastModified、changeFrequency、priority屬性(Attribute)即可產生對應的標記節點,如圖四所示。


圖一 建立ASP.NET Futures AJAX Web Site專案。


圖二 自動加入Microsoft.Web.Preview.dll參考。


程式2:專案配置檔


圖三 AspNetSiteMapSearchSiteMapProvider類別產生Sitemaps結果。


圖四 指定屬性(Attribute)產生對應的標記節點Sitemaps。


了解借由AspNetSiteMapSearchSiteMapProvider類別來讀取Web.sitemap檔案來產生Sitemaps方式後,接著讓我們來看如何借由繼承DynamicDataSearchSiteMapProvider類別與覆寫DataQuery方法來動態產生我們要的Sitemaps,首先於專案總管上選擇專案加入[App_Code]的ASP.NET資料夾,於該資料夾內加入一類別檔SupplierSiteMapData,程式碼內容如程式3所示,SupplierSiteMapData類別是繼承DynamicDataSearchSiteMapProvider,再覆寫DataQuery方法,該方法以迴圈方式動態產生十筆供應商資料,實際可能連結至資料庫取回要傳回的資料,當然也可以透過LINQ來篩選資料,該方法傳回型態為IEnumerable;接著進行配置檔的設定,於< providers>內加入
< add name="Supplier" type="SupplierSiteMapData, App_Code" targetUrl="Supplier.aspx" />
修改圖三的FromWebsitemap為Supplier,瀏灠結果為圖五,出現十筆供應商資料的Sitemaps,而下表一為各對應的屬性(Attribute)與說明;於< providers>內加入
< add name="Supplier2" type="SupplierSiteMapData, App_Code" targetUrl="Supplier.aspx" queryStringDataFormatString="SName={0}&SID={1}"
queryStringDataFields="SupplierName,SupplierID" />
修改圖三的FromWebsitemap為Supplier2,瀏灠結果為圖六所示,網頁參數的格式改變。

程式3:SupplierSiteMapData類別程式


圖五 十筆供應商資料的Sitemaps結果圖。


表一 自訂產生Sitemaps屬性表


圖六 網頁參數的格式改變結果。

學會利用ASP.NET Futures產生Sitemaps的作法後,接著讀者可將產生的Sitemaps透過Google Webmaster Tools(https://www.google.com/webmasters/sitemaps)提交至Google、亦可以透過Yahoo的Site Explorer(https://siteexplorer.search.yahoo.com/)提交至Yahoo,而MSN只能透過MSN Submit URL (http://search.msn.com/docs/submit.aspx)提交URL至MSN。

2009年4月1日 星期三

介紹Dynamic Data Controls for ASP.NET 1-1

RunPC165期:領先體驗微軟ASP.NET的「未來之路」(1)哇~原來可以不必寫程式


微軟在今年五月、七月分別釋出了ASP.NET未來的預覽版本:Microsoft ASP.NET Futures May 2007、Microsoft ASP.NET Futures July 2007(May 2007、July 2007代表版本的釋出日期,這個版本簡稱"Futures");ASP.NET Futures中包含了很多正發展中新版ASP.NET和Silverlight的功能。這些功能將有助於開發人員建立更加友善的用戶體驗應用程式。首先,我們針對ASP.NET Futures所提供的新功能作以下簡單的介紹:

微軟ASP.NET Futures簡介

微軟ASP.NET Futures包含了目前正發展中的新版ASP.NET和Silverlight的功能:

• ASP.NET AJAX Futures:2007 年 1 月底時推出了官方Framework 的正式版 - ASP.NET AJAX v1.0,它是一個不受拘束的架構,可讓您快速地在所有常見的瀏覽器上,建立更有效率、更互動式、更高度個人化的新一代網頁經驗。而Futures中針對AJAX功能加入了諸如瀏覽器瀏覽歷程的管理、以CSS選擇器或類別選擇成員許多新的功能等。
• Silverlight Controls for ASP.NET:Silverlight為新一代的Web展示層技術,具備極為優越的向量動畫、2D繪圖與影音播放能力,而Futures提供了兩個新的ASP.NET伺服器控制項將Silverlight加入Web程式,Media控制項能將WMA、WMV之類的影音媒體加入Web程式,XAML控制項能參考自己的XAML並結合JavaScript檔案。
• Dynamic Data Controls for ASP.NET:這是一組能在執行階段獲取資料庫結構資訊的ASP.NET伺服器控制項、它可根據使用者常見的提供預設顯示格式,且它也非常容易讓我們自定所要顯示的格式。
• ASP.NET Application Services:能將搜尋加入Web程式的新的ASP.NET服務,使用諸如Windows Live Search、Google Search之類的商用搜尋引擎API,並能自定搜尋提供者;而且它提供的Search sitemaps可以輕易的使搜尋引擎非常容易探索您的站台。
• 支援動態語言:藉由Dynamic Language Runtime(DLR)平臺,讓ASP.NET支援動態語言,目前支援了IronPython和Managed JScript。



ASP.NET Futures開發環境建置與介紹

您要領先體驗微軟ASP.NET的「未來之路」前,您必須先確定您的作業系統為Windows Sever 2003、Windows XP SP2、Windows Vista三者其中之一,且已安裝Microsoft Visual Studio 2005 或 Visual Studio 2008 (Beta 2) 還是Microsoft Visual Web Developer 2005 或 Visual Web Developer 2008 (Beta 2)其中之一個整個合開發工具,若你是Visual Studio 2005或Visual Web Developer 2005,你還必須額外再安裝ASP.NET 2.0 AJAX Extension 1.0,再從微軟網站下載最新的"Futures"(ASPNETFutures.msi)進行安裝,開發環境整理如表一;而在asp.net網站也有提供快速教學檔,http://quickstarts.asp.net/futures/。


表一 ASP.NET Futures整合開發環境


筆者依上建置兩開發環境,開發環境一為:Windows XP SP2 中文專業版 + Visual Studio 2005 英文專業版 + Microsoft ASP.NET Futures (July 2007);開發環境二為:Windows Server 2003 Enterprise Edition + Visual Studio 2008 Beta 2 + Microsoft ASP.NET Futures (July 2007),而(表二)我們可以清楚的比較出安裝Futures前後的差異,首先我們從表二右圖已安裝Futures畫面左下角選擇開發語言處,可清楚見到除了先前的Visual Basic與Visual C#、Visual J#外,還加入了IronPython和Managed Jscript動態語言;除此之外在範本的部分也增加了Dynamic Data Web Site、ASP.NET Futures AJAX Web Site、ASP.NET Futures Web Site三個專案範本。
讀者可以依所需建置開發環境一或開發環境二;筆者因考量目前大都使用者為Visual Studio 2005環境,故此以後章節圖檔截取皆會以開發環境一來做介紹。

表二 Futures安裝前後比較圖表

介紹Dynamic Data Controls for ASP.NET 1-2

RunPC 165期:領先體驗微軟ASP.NET的「未來之路」(1)哇~原來可以不必寫程式


動態資料控制項(Dynamic Data Control;DDC)簡介

動態資料控制項(Dynamic Data Control;DDC)有人說它簡直就是ASP.NET版本的Ruby on Rails,不需要配置、也不須程式碼更無需任何事前動做,它只要一個控制項,一個完整的資料驅動程式就此搞定。筆者在看完官方網站提供的示範影片和眾多相關討論區的網友一樣,驚訝!心中憂喜參半,喜的是真的不用寫一行程式碼,就可以完成一個資料驅動程式耶!但,如果再這麼發展下去程式設計人員真的要好好思考自己的價值所在。
動態資料控制項集是ASP.NET伺服器控制項的一個新集合,它在執行階段自動獲取資料庫的結構資訊,根據使用者常見的顯示格式與預期,提供了預設的呈現格式,而且它也非常容易讓我們自定所要顯示的格式;當您安裝完Futures後,在Visual Studio的工具箱中會多出兩組伺服器控制項,其索引標籤名稱為ASP.NET Futures與ASP.NET Futures - Dynamic Data,如圖一所示,動態資料控制項集合包含DynamicAutoData、DynamicList、DynamicDetails、DynamicFilter、DynamicInsert、DynamicNavigator、DynamicRssLink等七個動態資料控制項,分別整理表列如表三;而另一組ASP.NET Futures控制項集合我們會在其它篇文章加以介紹。


圖一 ASP.NET Futures新增兩組控制項集合。



表三 各動態資料控制項介紹


只要DynamicAutoData控制項,不必寫程式

動態資料控制項的運作過程,它會自動搜尋專案中的資料庫,自動選擇與頁面檔案名相同的資料表或檢視表,自動提供列表顯示(DynamicList)、詳細內容顯示(DynamicDetails)、新增、刪除、修改、查詢、過濾(DynamicFilter)、分頁、排序以及RSS(DynamicRssLink)等功能,這些功能都是自動的,只要一個DynamicAutoData控制項,一個完整的資料驅動程式就此搞定。它是除了DynamicNavigator動態資料控制項外,功能最為全面的一個,幾乎將其它的動態資料控制項功能統統顯示到一個頁面上。
接下來讓我們實作一個,不必寫程式的Web應用程式吧!首先,請您依前您所建置的開發環境,開啟Microsoft Visual Studio 2005或Microsoft Visual Studio 2008 (Beta 2),在功能表上選擇[檔案]、[新增]、[網站],出現如表一右側圖,選擇[Dynamic Data Web Site]專案範本後確定,建立專案如圖二,它自動加入了些專案參考元件,且少了Default.aspx檔案(這是因為動態資料控制項是依資料表與面頁檔名配對,故不先預建Default.aspx檔案)。接著依您專案的需要加入一個mdf的MS SQL資料庫檔案或新建一個,在此我們拿MS SQL Server提供的NorthWind範本資料庫來作示範,將NorthWind.mdf複製到專案中的[App_Data]資料夾;接著開啟伺服器總管如圖三,即可獲得NorthWind資料庫的資料表資訊;接下來在專案上[加入新項目],如圖四,選擇範本Dynamic Data Web Form再設名稱同圖三資料表名稱,本例將頁面名設為Employees.aspx來顯示Employees資料表資料,加入後網頁原始檔內容為程式1。至此我們還未寫入一行程式碼,按F5執行此頁,結果畫面如表四,已含蓋其餘五個態資料控制項功能(除DynamicNavigator外),且連圖檔欄位亦不需額外加以處理,更有趣的是也支援外來鍵的直接鏈結,具完整資料驅動程式,在一個頁面上擁有所有的CRUD(Create、Read、Update、Delete)操作。


圖二 建立Dynamic Data Web Site專案後的方案總管。


圖三 NorthWind資料庫結構。



圖四 加入Dynamic Data Web Form同資料表Employees名稱。



程式1



表四 加入DynamicAutoData動態資料控制項Employees.aspx執行畫面片段

(註:DynamicAutoData執行畫面切割為三個片段說明,右側兩欄分別為對應之動態資料控制項與其具備操作功能。)
動態資料站台配置檔相關設定
選擇配對的資料庫:若讀者有試著打開圖二之Web.config,會發覺該專案幫我們自動加入很多配置設定;首先我們先了解動態資料控制項,如何選擇要與其配對的資料庫與其順序,系統會先查看配置檔內是否有明確指定資料庫連接字串,若無,才接著查看配置檔內是否恰好僅有一個資料庫連接字串,若多於一個則必須於明確指定,若無,則至專案[App_Data]資料夾查看是否有僅有一個資料庫檔案,同上若多於一個則依舊必須於明確指定要連結的字串;而上面的的例子,配置檔只用預設內容,又[App_Data]資料夾僅有一個NorthWind.mdf資料庫檔案,故會選此資料庫檔案當動態資料控制項的配對資料庫。
配置資料表或檢視表:上例中我們指定頁面要顯示Employees資料表,故指定頁面名稱為Employees.aspx,若希望能在兩個頁面呈現Employees資料表時,請在專案上建立Employees資料夾,在資料夾內用到的動態資料控制項皆會以Employees資料表為呈現資料;如圖四在資料夾內建立list.aspx與details.aspx兩檔案,兩檔案皆只用到DynamicAutoData動態資料控制項,但卻分別預設用以列表顯示與詳細內容顯示,可以在配置檔案內指定listView與detailsView以修改預設頁面名稱;當然亦可以修改資料表對應資料夾名稱,如程式碼2,修改成MyList.aspx與MyDetails.aspx為列表顯示與詳細內容顯示,而MyEmployees資料夾是對應至Employees資料表。


程式2


整合動態資料控制項與ASP.NET伺服器控制項
除了表三對各動態資料控制項的簡單介紹外,表五中我們整理出各動態資料控制項與現行 ASP.NET伺服器控制項的對應表,我們可以在動態資料頁(Dynamic Data Page)上,放置除DynamicAutoData外的動態資料控制項與其對應的ASP.NET伺服器控制項,然後各自對對應的ASP.NET伺服器控制項進行屬性的設定(如:背景色)或套用其自動格式化…等設定其外觀樣式,最後指定各動態資料控制項的ControlID為對應的ASP.NET控制項ID,即可使現行運行上的樣版輕鬆套用至各動態資料控制項上。
下圖五我們在專案上建立一Products資料夾,該資料夾下之動態資料頁皆是針對Products資料表進行操作,在該資料夾內加入ProductsList.aspx之動態資料頁,將頁內之DynamicAutoData控制項刪除,加入動態資料控制項:DynamicList與其對應之ASP.NET伺服器控制項:GridView,將DynamicList之ControlID設為GridView1(GridView之ID)後,設定GridView1的自動格式化為秋天,再設定其屬性AllowSorting與AllowPaging為True,執行後即如圖五所示;若將DynamicList屬性EnableDelete與EnableUpdate設為False則只能唯讀,刪除與編輯的功能則被拿掉,若再將GridView屬性AutoGenerateDeleteButton與AutoGenerateEditButton設為True則刪除與編輯功能會再被加入,故可知動態控制項屬性與其對應ASP.NET伺服器控制項屬性設定有衝突時,會以ASP.NET伺服器控制項設定為主。

表五 動態資料控制項與ASP.NET控制項對應表



圖五 動態資料控制項與其對應ASP.NET控制項的執行畫面。


動態資料控制項的自定顯示功能
若您開啟任一動態資料頁的程式碼頁面,它會告知您有GetColumns()、GetDetailsColumns()、GetRSSFields()、InitRow(row)、InitDataSource(dataSource)等五個方法可供覆寫,將之整理如表六,其中GetColumns方法可指定DynamicList要傳回的欄位、自定欄位組合、自定欄位組合含欄位名,後兩者VB.NET尚不支援,C#與IronPython、Managed Jscript動態語言可實作;GetDetailsColumns方法為可指定DynamicDetails要傳回的欄位; GetRSSFields方法只取前兩個欄位,分別代表RSS的Item標籤title與description,其RSS標籤link會以details.aspx加網址參數表示,該網頁會以DynamicDetails呈現該筆可維護資料;InitRow方法可依條件指定資料列要呈現的樣式;InitDataSource方法可設定其過濾條件運算式。

表六 動態資料控制項五覆寫方法


因為要示範各覆寫方法,所以我們拿DynamicAutoData動態資料控制項來示範,首先,在Products資料夾內新建一動態資料頁,該頁面即會預建一個DynamicAutoData動態資料控制項,而程式3是各方法覆寫方法與說明,除InitDataSource外其餘皆可正常顯示,如圖六所示。

程式3



圖六 DynamicAutoData動態資料控制項覆寫各方法後之畫面。


DynamicAutoData VS DynamicNavigator動態資料控制項
最後筆者將介紹比DynamicAutoData還神奇的DynamicNavigator動態資料控制項,如果您將DynamicAutoData視為是自動針對整個資料表維護程式進行產出,那您可以視DynamicNavigator為自動針對整個資料庫維護程式進行產出,以後我們可能只要將資料庫的資料表建立好、各關聯設定好、其它資料庫規則定義完成,整個資料庫的網頁維護程式,連一行程式碼都不用就可以完成,沒錯,它就是這麼神奇,這是如何辦到的呢?只要三步驟,首先,一如往常在專案中加入一動態資料頁,再將頁面上的DynamicAutoData換成DynamicNavigator動態資料控制項,確定IncludeTables與IncludeViews屬性為True;最後修改Web.Config配置檔內dynamicDataControls標籤屬性showAllTables設為true即可;當然您可以加入一選項步驟,整合Menu伺服器控制項將自動格式化配置為繽紛,再將DynamicNavigator的CotrolID指定為Menu,結果如圖七所示,全部真的不需半行程式碼。


圖七 DynamicNavigator動態資料控制項維護整個資料庫畫面。


結論
本期筆者為各位介紹ASP.NET Futures的五大新功能之一:動態資料控制項,雖然功能上仍有些許小遺憾,且目前資料庫的部分只支援MS SQL Server,但相信在不久的將來微軟應會對自家的Access與其它像是Oracal、MySQL…等資料庫提供支援;而讀者在看完本期介紹的動態資料控制項後也應可以領先體會『哇~原來可以不必寫程式』這標題的意思,當然在讚嘆之餘,身為程式設計師的我們也必須好好省思自己的定位!

參考資源
ASP.NET Futures快速教學網:http://quickstarts.asp.net/Futures/
ASP.NET Futures官方論壇網:http://forums.asp.net/1127.aspx
動態資料控制項示範教學影音檔:http://download.microsoft.com/download/5/9/8/5985f834-b3ea-459b-98ba-0aede5bc653a/DynamicDataControls.wmv
加入書籤: MyShare HemiDemi Baidu Google Bookmarks Yahoo! My Web PChome Del.icio.us Digg technorati furludn bookmark 其他更多書籤

BOOKS:New and Upcoming