現代 Web 控制項(TreeView、TabStrip、ToolBar、GridView 啟用排序/分頁等)若無客戶端腳本支援,每次互動都需完整回傳,導致閃爍、延遲、伺服器負載高。ASP.NET 2.0 讓伺服器控制項能輸出 JavaScript/DHTML,實現豐富用戶體驗與高效能雙贏。
適用於極簡單行為(彈出確認、變色、簡單驗證)。直接在渲染階段輸出 HTML 事件屬性。
public class ConfirmButton : Button
{
public string ConfirmMessage { get; set; } = "確定執行?";
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute("onclick", string.Format("return confirm('{0}');", ConfirmMessage.Replace("'", "\\'")));
}
}
使用:<cc:ConfirmButton runat="server" Text="刪除" ConfirmMessage="確定刪除?" />
當邏輯超過幾行、需跨控制項共用、或涉及 DOM 操作/AJAX 時,必須將 JavaScript 封裝為獨立檔案,並透過 ScriptManager 註冊為腳本參考。
MyControl.js,定義命名空間與類別:Type.registerNamespace('MyControls');
MyControls.AutoCompleteBox = function(element) { MyControls.AutoCompleteBox.initializeBase(this, [element]); }
MyControls.AutoCompleteBox.prototype = {
initialize: function() {
MyControls.AutoCompleteBox.callBaseMethod(this, 'initialize');
$addHandler(this.get_element(), 'keyup', Function.createDelegate(this, this._onKeyUp));
},
_onKeyUp: function(e) { /* AJAX 呼叫取得建議清單 */ },
dispose: function() { MyControls.AutoCompleteBox.callBaseMethod(this, 'dispose'); }
}
MyControls.AutoCompleteBox.registerClass('MyControls.AutoCompleteBox', Sys.UI.Control);
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
ScriptControl(需引用 System.Web.Extensions.dll),實作 GetScriptReferences、GetScriptDescriptors:[RequiredScript(typeof(ScriptManager))]
public class AutoCompleteBox : ScriptControl
{
protected override IEnumerable GetScriptReferences()
{
yield return new ScriptReference("MyControls.AutoCompleteBox.js", "MyControlsAssembly");
}
protected override IEnumerable GetScriptDescriptors()
{
ScriptControlDescriptor descriptor = new ScriptControlDescriptor("MyControls.AutoCompleteBox", ClientID);
descriptor.AddProperty("serviceUrl", ServiceUrl);
yield return descriptor;
}
public string ServiceUrl { get; set; }
}
[assembly: WebResource("MyControls.AutoCompleteBox.js", "application/x-javascript")],並設定 .js 為 Embedded Resource。| 策略 | 說明 | 優點 |
|---|---|---|
| 內嵌資源 | .js 設為 Embedded Resource,隨組件部署 | 版本同步、無檔案遺失、支援 ScriptManager 合併壓縮 |
| CDN/靜態檔案 | 部署至 CDN 或網站 Scripts 資料夾 | 瀏覽器快取、減少組件大小、支援並行下載 |
| ScriptManager 合併 | <asp:ScriptManager CompositeScript="true"> | 減少 HTTP 請求、自動最小化 |
| ScriptLoader (ASP.NET 4.5+) | 使用 ScriptManager.ScriptResourceMapping 定義 CDN 路徑與 fallback | 生產環境用 CDN,離線開發用本地 |
Page.ClientScript.RegisterHiddenField 或 <input type="hidden"> 保存客戶端狀態,回傳時伺服器讀取。UpdatePanel 內,配合 Triggers 實現無縫 AJAX 體驗。EnableScriptGlobalization、EnableScriptLocalization 支援多語系腳本資源。dispose() 釋放事件處理常式、計時器、DOM 參考,防記憶體洩漏。ScriptManager 管理腳本相依順序(如先載入 jQuery 再載入擴充外掛)。掌握「內嵌腳本 → 獨立 .js + ScriptControl → 部署最佳化」三階演進,即可打造兼具豐富互動、高效能、易維護的 ASP.NET 2.0 伺服器控制項。善用 ScriptManager 生態系,讓客戶端程式碼像伺服器端一樣模組化、版本化、可重複使用。