c# - .NET Core 提交将所有数据传递给控制器,除了 id
问题描述
.NET Core 3.1 和 EF Core,尝试更新加载到表单中的数据,但由于某种原因,它在提交时设置了 Id = 0,我不知道为什么。或者,如果我明确设置 id 值,控制器会为所有记录获取一个空值。重要的是,它是我发送到数据库的实体列表。
我可以使用相同的表单很好地创建多个记录。但是,如果我用现有记录加载表单,并且想要进行更改,我不能。如果我没有为每条记录输入 ID,则每条记录的 ID 都设置为零。如果我确实输入了每条记录的 Id,则表单似乎正确提交,因为我正在查看 Chrome DevTools 并看到值在那里,包括 Id,但随后控制器获取了该数据,并且它为空.. .
ETA当我提交带有每行包含的 ID 的表单时,看起来第 41 行导致了问题。我不知道这是否意味着 41 行太多,或者数据本身存在一些问题,这意味着控制器不会接收任何数据......但这些都没有意义,因为表单加载 62 行就好了。
这是它的简化版本,其中包含关键部分,因此很有意义。
我的模型:
@model List<EvaluationsModel>
我的表格:
@{
var createOrUpdate = "Update";
if (Model[0].IsCreate)
{
createOrUpdate = "Create";
}
}
<form id="evalForm" asp-action="@createOrUpdate">
@for (var i = 0; i < Model.Count; i++)
{
<textarea asp-for="@Model[i].Comments" rows="5" cols="75"></textarea>
<input asp-for="@Model[i].Id" type="hidden" />
}
<input type="submit" id="submitButton" value="@createOrUpdate" class="btn btn-primary" />
我的控制器方法:
public IActionResult Update(List<EvaluationsModel> evalRows)
{
_dostuffWith(evalRows);
return Redirect(toGet);
}
解决方案
有时隐藏字段中的 asp-for 由于某些原因无法正常工作,我通常也使用 value
<input asp-for="@Model[i].Id" value"@Model[i].Id" type="hidden" />
恕我直言,您必须将 Id 添加到您的模型中,以防它不是更新,而是创建
public ViewModel
{
public List<EvaluationsModel> EvaluationsModels {get;set;}
public int Id { get; set;}
{
并将隐藏字段 ID 添加到视图中
@model ViewModel
....
<form id="evalForm" asp-action="@createOrUpdate">
<input type="hidden" asp-for="Id" value="@Model.Id" />
@for (var i = 0; i < Model.EvaluationsModels.Count; i++)
行动
public IActionResult Update(ViewModel viewModel)
推荐阅读
- php - 共享访问:如何修复“fread():长度参数必须大于 0”?
- laravel - 如何在 Laravel Eloquent 中加入 3 个以上的表
- spring - org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“securityInterceptor”的bean时出错
- python-3.x - 你如何打印在循环类中找到的变量
- laravel - Laravel,关系为空
- android - 边框半径在三星 Galaxy J7 中不起作用
- apache-spark - 使用 spark.read 读取大 csv 文件时是否需要手动重新分区
- macos - 收到错误“用户不在 sudoers 文件中。将报告此事件。”
- pandas - Dask Dataframe groupby 产生一个 pandas 系列,我该如何返回一个 dask 数据框?
- javascript - v8 NewInstance 内存泄漏