Visual Studio 2008 預設針對 .NET Framework 3.5 (含 ASP.NET AJAX 內建)。若專案目標為 .NET 2.0,需手動安裝擴充套件並調整組件版本參考。
安裝完成後,VS2008 新增專案/新增項目 對話方塊將出現 AJAX 相關範本。
專案建立後,必須手動修改 Web.config 指定 System.Web.Extensions 版本為 1.0.61025.0 (.NET 2.0 AJAX 版本),而非 3.5 版本 (3.5.0.0)。
<configuration>
<system.web>
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI"
assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</controls>
</pages>
</system.web>
</configuration>
<compilation debug="true">
<assemblies>
<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Extensions.Design, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<httpHandlers>
<add verb="*" path="*.asmx"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add verb="*" path="*_AppService.axd"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add verb="GET,HEAD" path="ScriptResource.axd"
type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpHandlers>
<httpModules>
<add name="ScriptModule"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpModules>
IIS 7+ 整合模式 需對應至 system.webServer/handlers、modules 區段。
<%@ Page Language="C#" %>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<label runat="server" id="lblTime"></label>
<%= DateTime.Now.ToString() %>
<asp:Button ID="btnUpdate" runat="server" Text="更新時間" OnClick="btnUpdate_Click" />
<asp:Timer ID="Timer1" runat="server" Interval="5000" OnTick="Timer1_Tick" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnUpdate" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<hr />
<%= DateTime.Now.ToString() %> <!-- 頁面其餘部分不更新 -->
<asp:Button ID="btnFullPost" runat="server" Text="完整回發" />
</div>
</form>
protected void btnUpdate_Click(object sender, EventArgs e) {
lblTime.InnerText = "部分更新: " + DateTime.Now.ToString();
}
protected void Timer1_Tick(object sender, EventArgs e) {
lblTime.InnerText = "計時器觸發: " + DateTime.Now.ToString();
}
| 控制項 | 功能 | 關鍵屬性/事件 |
|---|---|---|
ScriptManager | 管理 AJAX 腳本、Web 服務代理、部分渲染 | EnablePartialRendering, Services, Scripts |
UpdatePanel | 定義部分更新區域 | UpdateMode (Always/Conditional), ChildrenAsTriggers, Triggers |
ContentTemplate | UpdatePanel 內容區塊 | 放置需部分更新的控制項 |
AsyncPostBackTrigger | 指定觸發非同步回發的控制項/事件 | ControlID, EventName |
PostBackTrigger | 指定觸發完整回發的控制項 (如檔案上傳) | ControlID |
Timer | 定時觸發非同步回發 | Interval (毫秒), OnTick |
| 問題 | 原因 | 解決 |
|---|---|---|
| 「無法載入型別 System.Web.UI.ScriptManager」 | 組件版本不符 (參考 3.5 版而專案為 2.0) | 檢查 Web.config 所有 System.Web.Extensions 版本為 1.0.61025.0 |
| UpdatePanel 不更新 | UpdateMode=Conditional 但無 Trigger、或控制項不在 ContentTemplate 內 | 加入 AsyncPostBackTrigger、確認控制項位置 |
| ScriptResource.axd 404 | httpHandlers 未註冊、或 IIS 7 整合模式缺 system.webServer/handlers | 補全 handlers 註冊、或切換應用程式集區為傳統模式 |
| 非同步回發後 JavaScript 錯誤 | UpdatePanel 更新後 DOM 重建,原有事件綁定失效 | 使用 pageLoad() 函數或 ScriptManager.RegisterStartupScript 重新綁定 |
| 大量 ViewState 導致回發緩慢 | UpdatePanel 內控制項過多、ViewState 未優化 | 設定 EnableViewState=false、使用 ControlState、壓縮 ViewState |
在 VS2008 開發 .NET 2.0 AJAX 應用,關鍵在於:安裝正確擴充套件 → Web.config 精確鎖定 1.0.61025.0 版本 → 掌握 ScriptManager/UpdatePanel/Timer 核心控制項 → 處理非同步回發後的客戶端腳本重綁定。此為歷史版本維護必備知識,新專案建議直接採用現代前後端分離架構。