在呼叫 ASP.NET Web API 的 POST 方法時,明明已在 Client 端設定 `Content-Type: application/x-www-form-urlencoded` 並送出資料,但 Server 端的 Action 參數永遠是 `null`,無論是基本型別還是複雜模型皆無法繫結。
ASP.NET Web API 的預設模型繫結器在處理 `application/x-www-form-urlencoded` 時,期望請求主體為標準的 **鍵值對格式**,即 `key=value&key2=value2`。若 Client 直接發送裸字串 (如 `"abc"`) 而非 `=abc` 或 `param=abc`,繫結器無法解析參數名稱,導致繫結失敗。
| 情境 | 請求主體 | 結果 |
|---|---|---|
| 錯誤 | abc | 參數為 null |
| 正確 (單一參數) | =abc | 參數繫結為 "abc" |
| 正確 (具名參數) | myParam=abc | 參數繫結為 "abc" |
jQuery AJAX
// 錯誤:data 直接放字串
$.ajax({
url: '/api/values',
type: 'POST',
data: 'abc', // 缺少參數名
contentType: 'application/x-www-form-urlencoded'
});
// 正確:使用物件或編碼字串
$.ajax({
url: '/api/values',
type: 'POST',
data: { '': 'abc' }, // 空鍵名對應單一參數
// 或 data: '=abc'
contentType: 'application/x-www-form-urlencoded'
});
HttpClient (C#)
// 錯誤
var content = new StringContent("abc", Encoding.UTF8, "application/x-www-form-urlencoded");
// 正確:使用 FormUrlEncodedContent 自動編碼
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair("", "abc") // 空鍵名
// 或 new KeyValuePair("param", "abc")
});
// 單一基本型別參數:模型繫結器會嘗試從請求主體讀取
public IHttpActionResult Post([FromBody] string value) { ... }
// 複雜模型:需具名鍵值對
public class MyModel { public string Name { get; set; } }
public IHttpActionResult Post([FromBody] MyModel model) { ... }
Web API 接收 `application/x-www-form-urlencoded` POST 資料時,**務必確保請求主體為合法的鍵值對格式** (至少包含一個 `=`)。單一參數可用空鍵名 `=value`,多參數用 `key1=val1&key2=val2`。搭配 `[FromBody]` 屬性即可正確繫結。