无法删除对象列表:ViewDataDictionary模型类型不匹配问题求助
问题解决:删除数据时模型类型不匹配错误
错误原因
错误提示清晰说明:传递给ViewDataDictionary的模型是List<TournamentDetails>集合类型,但Delete视图要求的是单个TournamentDetails对象,同时视图表单的提交目标与控制器Post方法存在不匹配。
修复方案
1. 修正控制器Delete方法与视图模型的匹配
根据你的业务需求选择以下两种方案:
方案A:删除单个记录(TournamentNumber为唯一标识)
修改控制器Delete方法,返回单个对象而非列表,并补充空值判断:
public async Task<IActionResult> Delete(int? Id) { if (Id == null) { return NotFound(); } // 异步获取单个匹配对象 var result = await _context.TournamentDetails .FirstOrDefaultAsync(b => b.TournamentNumber.Equals(Id)); if (result == null) { return NotFound(); } return View(result); }
此时Delete视图的模型声明@model TournamentDetails无需修改,保持原样即可。
方案B:删除多条匹配记录
如果TournamentNumber不是唯一标识,需要删除多条数据,先修改Delete视图的模型声明为集合:
@model IEnumerable<TournamentDetails>
然后调整视图内容,遍历显示所有待删除记录:
<form method="post" asp-controller="TournamentDetails" asp-action="Delete"> @foreach(var item in Model) { <input asp-for="@item.TournamentNumber" hidden /> <div class="border p-3 mt-4"> <div class="mb-3"> <label>@item.TournamentName</label> <input value="@item.TournamentName" disabled class="form-control" /> </div> </div> } <button type="submit" class="btn btn-danger" style="width:150px">删除选中项</button> <a asp-controller="TournamentDetails" asp-action="Index" class="btn btn-secondary" style="width:150px"> 返回列表 </a> </form>
同步修改控制器Delete方法,异步返回匹配的列表:
public async Task<IActionResult> Delete(int? Id) { if (Id == null) { return NotFound(); } var result = await _context.TournamentDetails .Where(b => b.TournamentNumber.Equals(Id)) .ToListAsync(); if (!result.Any()) { return NotFound(); } return View(result); }
2. 修正视图表单的提交目标
Delete视图的表单asp-action需与控制器Post方法的ActionName保持一致,改为Delete:
<form method="post" asp-controller="TournamentDetails" asp-action="Delete">
同时优化控制器Post方法的异步逻辑:
[HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<IActionResult> DeletePost(int? Id) { if (Id == null) { return NotFound(); } var objs = _context.TournamentDetails.Where(b => b.TournamentNumber.Equals(Id)); if (!objs.Any()) { return NotFound(); } _context.TournamentDetails.RemoveRange(objs); await _context.SaveChangesAsync(); // 异步保存变更 return RedirectToAction("Index"); }
额外提示
- 必须处理
Id == null和查询结果为空的场景,避免空引用异常。 - EF Core操作优先使用异步方法(带
Async后缀),提升应用性能和响应性。
内容的提问来源于stack exchange,提问作者Bean0341
相关产品推荐
相关产品推荐

