2008年4月26日 星期六

在 Server Control 裡使用 資源檔

Ref :http://aspalliance.com/articleViewer.aspx?aId=726&pId=-1

以往在設計 Server Control 元件時,常常會為了需要嵌入圖片或是JavaScript檔而煩惱。透過 .Net 2.0所提供的新方法,讓我們在設計自行研發的元件時,更有彈性。

一、如何建立 Server Control。
01.先建立一個測試專案:ServerControlTest

02.在ServerControlTest專案中,建立一個資源檔(Resource) .resx

03.開啟 Resource.resx,選擇加入資源頁籤,並加入你的檔案。可以是圖檔、文字檔。範例中,我同時加入圖片檔(icon-find.gif)、Javascript(jsMMS.js)檔以及字串 test來說明。

04.由於我們希望將圖片、文字檔都能夠包在未來所產生的元件裡,不再需要透過連結方式來存取,所以要記得分別點選方案總管下的Resource資料夾裡的 icon-find.gif、jsMMS.js,將建置動作改為『內嵌資源』。

05.為了讓元件能夠存取資源檔裡所加入的檔案,可以到方案總管,看到專案裡的屬性頁籤資料夾,找到 AssemblyInfo.cs 檔,打開並編輯。

[詳細程式碼]

加入兩行:
[assembly: System.Web.UI.WebResource("ServerControlTest.Resources.icon-find.gif", "img/gif")]
[assembly: System.Web.UI.WebResource("ServerControlTest.Resources.jsMMS.js", "text/js")]

透過WebResource( v1,v2),定義了要去抓取資源檔的位置與檔案型態。
WebResource(v1,v2) 第一個參數,是一個包含完整的NameSpace名稱與資源檔所在路徑與檔名。[NameSpace].[路徑].[檔名],對照目前的範例,就是ServerControlTest.Resources.icon-find.gif。第二個參數則是檔案的型態定義:img/gif、text/js



二、如何使用 Resource。

01.在方案總管裡,我們需要加入兩個參考(Reference):
System.Web
System.Drawing


02.加入一個新的類別 SCTest01.cs [詳細程式碼]
並在其 using 的區塊,新增兩個 :
using System.Web.UI;
using System.ComponentModel;

我們將這個類別(SCTest01.cs)去繼承 Control 物件

03.覆寫 Render方法
protected override void Render(HtmlTextWriter writer)

首先建立一個 Image 物件,而這 Image物件的圖片來源,則是透過事先存在資源檔的圖片當作其來源。抓取資源檔的方法為:GetWebResourceUrl( )。
在這個方法裡,有兩個參數,第一個是要指定資源檔的類型,我們可以傳入 this.GetType()。第二個參數,則是要傳入資源名稱。這裡需特別注意的地方,是要傳入包含完整的NameSpace名稱與資源檔所在路徑與檔名。[NameSpace].[路徑].[檔名],對照目前的範例,就是ServerControlTest.Resources.icon-find.gif

介紹了抓圖檔之後,再提抓資源檔裡的字串方法,以Image.ToolTip為例。這個資源檔裡的字串,就相對簡單些了,只需要透過資源檔變數的屬性,就可以完成設定的動作。
[資源檔變數].[字串名稱]
Resource1.Test

為了讓這個圖示比較完美些,也在程式中加入了一個 onmouseover 的處理,讓游標移到 Image 物件上時,能夠變成『手指』的樣子。

此外,加入了 User 壓下按鈕時會觸發 JavaScript 的事件。

img.Attributes["onclick"] = "showWelcome();";

而 showWelcome() 正是我們事先定義在資源檔裡的 JavaScript。

最後,則是將設定好的 Image 物件加入目前的 控制項物件裡。

三、陷阱。

大部分的Server Control,都是透過覆寫 Render( ) 方法來完成。然而現在所介紹的資源檔,在使用字串、圖片等,都沒有問題。唯一有問題的,是 javascript。如果我們在 Render()方法裡去註冊事先定義在資源檔裡的 javascript,則會發生當 USER 觸發了按鈕而啟動 javascript方法時,因為 javascript尚未產生出來而發生錯誤的現象。為了避免這問題,就需要將註冊 javascript的動作提前,例如範例中,我將註冊的時間點提前在 OnInit( ) 的地方。

ps:可以參考先前 Server Control 生命週期 的介紹

四、使用 Server Control

01.先建立一個網站,MyTestWeb
02.在工具箱裡的一般頁籤,按滑鼠右鍵,點選『選擇項目』。

03.點選『瀏覽』按鈕,並挑選剛剛 Server Control 專案所產生的 dll 檔,確定後,就會在工具箱多了一個我們自訂的元件。

04.將我們自訂的元件,拖拉至 .aspx 頁面,即完成 Server Control 的叫用。


參考程式碼:\\3probe-server\RD2\Document\Program\Server Control\ServerControlTest.rar

沒有留言:

張貼留言