我在尝试删除返回多个项目的对象时遇到问题。当我运行以下代码时,出现以下错误:
“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>
您的删除视图需要具有
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
表中的唯一值。
如果答案是是,
您应该使用以下任一方法仅返回单个条目:
.Single()
。仅返回一条记录。请注意,当存在多个具有相同 TournamentNumber
的条目或未找到条目时,它将抛出异常。
.SingleOrDefault()
。仅返回一条记录或 null
。请注意,当存在多个具有相同 TournamentNumber
的条目时,它将抛出异常。
.First()
。返回第一个匹配的记录。请注意,当未找到条目时,它将抛出异常。
.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
表的主键/唯一列的条目。