首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

URL Rewrite 時修正 Form Action 屬性的最佳實踐:Control Adapter 方案

     編輯:關於ASP.NET

問題背景

使用 URL Rewrite 技術時,ASP.NET 的 `

` 會自動將真實的頁面路徑寫入 `action` 屬性,導致重寫後的 URL 暴露或表單提交錯誤。常見解法有三種:客戶端 JavaScript 修正、繼承 `HtmlForm` 類別、繼承 `Page` 類別。但前兩者各有缺點:JS 方案違背 URL Rewrite 隱藏伺服器細節的初衷;繼承 `HtmlForm` 會破壞 `OnSubmit` 事件處理,影響眾多 Web 控制項運作。

更優雅的方案:Control Adapter

ASP.NET 2.0 引入 Control Adapter 架構,允許在不繼承控制項的前提下,攔截並修改其渲染行為。利用 `App_Browsers` 目錄下的 `.browser` 定義檔,即可針對特定控制項(如 `HtmlForm`)指定自訂 Adapter,完美解決 Action 屬性問題。

實作步驟

1. 建立瀏覽器定義檔

在網站根目錄建立 `App_Browsers` 資料夾,新增 `RewriteForm.browser`:

<browsers>
 <browser refID="Default">
 <controlAdapters>
 <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
 adapterType="Kuang.HtmlFormAdapter" />
 </controlAdapters>
 </browser>
</browsers>

`refID="Default"` 表示擴展系統預設的瀏覽器定義(位於 `%windir%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers\Default.browser`)。

2. 實作 HtmlFormAdapter

using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.Adapters;

namespace Kuang
{
 public class HtmlFormAdapter : ControlAdapter
 {
 protected override void Render(HtmlTextWriter writer)
 {
 HtmlForm form = (HtmlForm)Control;
 // 取得重寫後的 URL
 string rawUrl = HttpContext.Current.Request.RawUrl;
 // 若為回發,保留原始 Action;否則使用重寫後的 URL
 if (!string.IsNullOrEmpty(rawUrl) && !Page.IsPostBack)
 {
 form.Action = rawUrl;
 }
 base.Render(writer);
 }
 }
}

原理說明

  • Control Adapter 位於 `Control` 與 ASP.NET 執行階段之間,提供重載 `Render` 方法的能力,且不需繼承原控制項。
  • 僅針對 `HtmlForm` 生效,避免影響其他使用 `action` 屬性的控制項。
  • 在 `Render` 階段修改 `Action`,確保輸出 HTML 正確,且不干擾 `OnSubmit` 等事件處理邏輯。

優點總結

  1. 不需修改現有頁面繼承關係,零侵入式部署。
  2. 不依賴客戶端腳本,符合 URL Rewrite 伺服器端重寫精神。
  3. 不破壞 `HtmlForm` 原有功能(如 `OnSubmit`、驗證控制項等)。
  4. 可針對不同瀏覽器定義不同 Adapter,擴展性極佳。

適用版本

需 .NET Framework 2.0 或以上版本支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved