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

ASP.NET MVC 模型綁定錯誤:Int32 無法轉換為 Array 的排查與修復

     編輯:程式設計綜合問答

開發者在 Edit 頁面點擊保存後跳轉 Index 時拋出異常:無法將類型為“System.Int32”的對象強制轉換為類型“System.Array”。錯誤堆疊指向模型綁定階段,經排查是模型屬性類型與視圖表單字段不匹配導致。

問題定位

模型中這個屬性:

[DisplayName("職稱代碼")]
[MaxLength(3)]
public int TitleID { get; set; } // 整數類型

但視圖 Edit.cshtml 中對應的表單字段可能渲染為:

<select name="TitleID" multiple>...</select> 
// 或
<input name="TitleID" value="1,2,3" /> // 逗號分隔字符串

提交時瀏覽器發送 TitleID=1,2,3(字符串),模型綁定器嘗試解析為 int[] 或 List<int>,但目標屬性是 int,類型不匹配拋出異常。

修復方案

方案一:修正視圖(推薦)

確保單選控件,移除 multiple 屬性:

@Html.DropDownListFor(m => m.TitleID, Model.TitleList, "請選擇", new { @class = "form-control" })
// 或
<select name="TitleID" class="form-control">
    @foreach (var item in Model.TitleList) {
        <option value="@item.Value">@item.Text</option>
    }
</select>

方案二:修改模型接收數組/列表

若業務確需多選,改模型屬性類型:

public int[] TitleIDs { get; set; } // 或 List<int>

控制器動作參數自動綁定數組。

方案三:自定義模型綁定器(不推薦,治標不治本)

public class CommaSeparatedIntBinder : IModelBinder {
    public object BindModel(ControllerContext cc, ModelBindingContext bc) {
        var value = bc.ValueProvider.GetValue(bc.ModelName);
        if (value == null) return 0;
        var parts = value.AttemptedValue.Split(',');
        return int.TryParse(parts[0], out int r) ? r : 0; // 取第一個
    }
}
// 註冊:ModelBinders.Binders.Add(typeof(int), new CommaSeparatedIntBinder());

Controller 代碼優化建議

原代碼混用 Response.Write 輸出腳本,不符合 MVC 模式:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(RetireeModel model) {
    if (!ModelState.IsValid) return View(model); // 返回原視圖顯示驗證錯誤
    
    db.Entry(model).State = EntityState.Modified;
    db.SaveChanges();
    TempData["Success"] = "保存成功"; // 用 TempData 傳遞提示
    return RedirectToAction("Index");
}

Index 視圖中讀取 TempData["Success"] 顯示彈窗,避免在 Controller 輸出 HTML/JS。

核心教訓

  • 模型屬性類型必須與表單字段名、值格式嚴格對應
  • 單選用 int/string,多選用 int[]/List<int>
  • 善用 @Html.EditorFor/DropDownListFor 強類型助手,編譯期即可發現類型不匹配
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved