无法删除对象列表

问题描述 投票:0回答:1

我在尝试删除返回多个项目的对象时遇到问题。当我运行以下代码时,出现以下错误:

“InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“System.Collections.Generic.List`1[Test.Models.TournamentDetails]”,但此 ViewDataDictionary 实例需要类型为“Test.Models.TournamentDetails”的模型项.”

我不明白为什么我无法退回我的模型?我已经尝试了堆栈溢出上发布的一些其他修复程序,但没有成功...任何帮助将不胜感激。

*** 索引视图***

 @model IEnumerable<TournamentDetails>

 @foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.TournamentName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.TournamentNumber)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.HandTime)
        </td>
        <td>
            <a asp-controller="TournamentDetails" asp-action="Delete" asp-route-id="@item.TournamentNumber"
            class="btn btn-danger mx-2"> <i class="bi bi-trash-fill"></i> Delete</a>
        </td>
    </tr>

}

*** 控制器***

    public async Task<IActionResult> Delete(int? Id)
    {
        var result = _context.TournamentDetails.Where(b => b.TournamentNumber.Equals(Id)).ToList();

        return View(result);
    }

[HttpPost,ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeletePost(int? Id)
{
    var obj = _context.TournamentDetails.Where(b => b.TournamentNumber.Equals(Id));
     _context.TournamentDetails.RemoveRange(obj);
    _context.SaveChanges();

    return RedirectToAction("Index");
}

*** 删除视图***

@model TournamentDetails

<form method="post" asp-controller="TournamentDetails" asp-action="DeleteTournament">
    <input asp-for="TournamentNumber" hidden />
    <div class="border p-3 mt-4">
        <div class="row pb-2">
            <h2 class="text-primary">Delete Tournament</h2>
            <hr />
        </div>
        <div class="mb-3">
            <label asp-for="TournamentName"></label>
            <input asp-for="TournamentName" disabled class="form-control" />
        </div>
        <button type="submit" class="btn btn-danger" style="width:150px">Delete</button>
        <a asp-controller="TournamentDetails" asp-action="Index" class="btn btn-secondary" style="width:150px">
            Back to List
        </a>
    </div>
</form>
asp.net-mvc model-view-controller
1个回答
0
投票

您的删除视图需要具有

Test.Models.TournamentDetails
类型的(单个)模型。

@model TournamentDetails

但是,您的“删除”控制器操作正在返回多个项目:

System.Collections.Generic.List
1[Test.Models.TournamentDetails]`

var result = _context.TournamentDetails
    .Where(b => b.TournamentNumber.Equals(Id))
    .ToList();

我让您认为 do

TournamentNumber
TournamentDetails
表中的唯一值。

如果答案是

您应该使用以下任一方法仅返回单个条目:

  1. .Single()
    。仅返回一条记录。请注意,当存在多个具有相同
    TournamentNumber
    的条目或未找到条目时,它将抛出异常。

  2. .SingleOrDefault()
    。仅返回一条记录或
    null
    。请注意,当存在多个具有相同
    TournamentNumber
    的条目时,它将抛出异常。

  3. .First()
    。返回第一个匹配的记录。请注意,当未找到条目时,它将抛出异常。

  4. .FirstOrDefault()
    。返回第一个匹配的记录或
    null
    .

public async Task<IActionResult> Delete(int? Id)
{
    var result = _context.TournamentDetails
        .SingleOrDefault(b => b.TournamentNumber.Equals(Id));

    if (result == null)
        return NotFound();

    return View(result);
}

此外,对于“Delete”和“DeletePost”操作,您允许

Id
参数可为空,这很奇怪。建议删除
?
的可空
Id
。当然,您必须需要
Id
才能对特定条目执行编辑/删除操作

此外,您应该仅删除 ID 的单个条目,而不是多个条目。

[HttpPost,ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeletePost(int? Id)
{
    var obj = _context.TournamentDetails
        .SingleOrDefault(b => b.TournamentNumber.Equals(Id));
    _context.TournamentDetails.Remove(obj);
    _context.SaveChanges();

    return RedirectToAction("Index");
}

如果答案是“否”,我建议您需要修改当前的实现。使用并搜索具有 TournamentDetails 表的主键/唯一列的条目。

    

© www.soinside.com 2019 - 2024. All rights reserved.