You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法删除对象列表: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:22:46