HTML 表單提交最基本的兩種方法是 **GET** 與 **POST**,ASP.NET 透過 `Request` 物件提供不同屬性接收資料。本文詳細比較兩者差異、程式碼接收寫法、安全性與適用場景。
<!-- GET 表單 -->
<form id="form1" method="get" runat="server">
姓名:<asp:TextBox ID="name" runat="server" /><br />
網站:<asp:TextBox ID="website" runat="server" /><br />
<asp:Button ID="Button1" Text="送出" runat="server" />
</form>
<!-- POST 表單 -->
<form id="form2" method="post" runat="server">
姓名:<asp:TextBox ID="name2" runat="server" /><br />
網站:<asp:TextBox ID="website2" runat="server" /><br />
<asp:Button ID="Button2" Text="送出" runat="server" />
</form>
URL 表現差異:
// 僅接收 GET
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.QueryString["name"];
string site = Request.QueryString["website"];
Response.Write($"GET: {name}, {site}
Method: {Request.RequestType}");
}
// 僅接收 POST
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.Form["name2"];
string site = Request.Form["website2"];
Response.Write($"POST: {name}, {site}
Method: {Request.RequestType}");
}
// 寫法 A:Request.Params(合併 QueryString、Form、Cookies、ServerVariables)
string name = Request.Params["name3"];
string site = Request.Params["website3"];
// 寫法 B:Request 索引器(同 Params,簡寫)
string name = Request["name4"];
string site = Request["website4"];
搜尋優先順序: `QueryString` → `Form` → `Cookies` → `ServerVariables`。同名參數以最先找到者為準。
| 比較項目 | GET | POST |
|---|---|---|
| 語意 | 從伺服器**獲取**資料(冪等、安全) | 向伺服器**提交**資料(非冪等、可能改變狀態) |
| 資料位置 | URL 查詢字串(`?key=val&...`) | HTTP Request Body |
| 可見性 | 網址列明顯可見,可書籤、分享 | 一般使用者不可見(開發工具可見) |
| 資料長度限制 | 受瀏覽器/伺服器 URL 長度限制(~2KB~8KB) | 理論無上限(受 `maxRequestLength`、IIS 設定影響) |
| 安全性 | 低(記錄在歷史、Proxy、伺服器 Log) | 較高(不在 URL,但非加密仍可攔截) |
| 快取行為 | 瀏覽器/Proxy 可能快取 | 預設不快取 |
| 回退/重新整理 | 無副作用(通常安全) | 瀏覽器會警告「重新提交表單」 |
| 編碼方式 | `application/x-www-form-urlencoded`(URL 編碼) | 同 GET 或 `multipart/form-data`(上傳檔案) |
正確選擇 GET/POST 並搭配對應的 `Request` 屬性接收,是建構符合 HTTP 語意、安全且可維護 Web 應用的基礎。