首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ASP.NET MVC 表單提交數據為 Null ?模型綁定失效常見原因與解決

     編輯:程式設計疑難解答

問題場景

遵循網上教程構建 ASP.NET MVC 應用,查詢、刪除功能正常,但表單提交新增數據時,Controller Action 參數屬性全為 `null`。調試發現 `Request.Form` 有值,但模型綁定未生效。懷疑與 JSON 序列化庫(如 LitJSON)衝突。

核心原因排查

  1. 表單字段名與模型屬性名不匹配:HTML `` 對應模型 `public string UserName { get; set; }`,大小寫、拼寫必須一致。
  2. 缺少 `[HttpPost]` 特性:Action 標記為 `[HttpGet]` 或無標記導致 POST 請求被忽略。
  3. Content-Type 不正確:表單提交需為 `application/x-www-form-urlencoded` 或 `multipart/form-data`,若前端 AJAX 發送 `application/json` 卻未在 Action 參數加 `[FromBody]`,默認模型綁定器不會處理 JSON Body。
  4. 全局過濾器/中間件干擾:自定義 `ActionFilter` 或中間件修改了 `Request.Body` 流位置或已讀取流導致後續綁定失敗。
  5. JSON 序列化衝突:引用 LitJSON 等第三方庫若註冊了自定義 `ValueProviderFactory` 或 `ModelBinder`,可能覆蓋默認綁定行為。

解決方案

方案一:標準表單提交(推薦新手)

@* View *@
@using (Html.BeginForm("Create", "User", FormMethod.Post)) {
    @Html.TextBoxFor(m => m.UserName)
    @Html.TextBoxFor(m => m.Email)
    
}

@* Controller *@
[HttpPost]
[ValidateAntiForgeryToken] // 防 CSRF
public ActionResult Create(UserViewModel model) {
    if (ModelState.IsValid) { /* 保存 */ }
    return View(model);
}

方案二:AJAX 提交 JSON

// JS
$.ajax({
    url: '/User/Create',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({ UserName: 'Tom', Email: 'tom@test.com' }),
    success: function(res) { /* ... */ }
});

// Controller
[HttpPost]
public ActionResult Create([FromBody] UserViewModel model) { // 必須加 [FromBody]
    // ...
}

調試技巧

  • 在 Action 開頭打斷點,查看 `Request.Form`、`Request.ContentType`、`Request.InputStream` 原始數據。
  • 臨時移除第三方 JSON 庫引用,驗證是否為衝突源。
  • 啟用 ASP.NET MVC 詳細錯誤頁面(`customErrors mode="Off"`)獲取完整異常堆疊。

總結

模型綁定失效多源於「約定不匹配」或「請求格式與綁定器不兼容」。優先使用強類型 HtmlHelper 生成表單,配合 `[HttpPost]`、`[ValidateAntiForgeryToken]`,遵循約定優於配置原則,可規避 90% 此類問題。

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