我手上有个很特别的问题...
我正在为我的公司编写一个管理webApp,用于管理工作、时间表和其他一堆事情……
我有一个视图,我可以在其中编辑SQLite数据库中以前插入的作业,并且我可以添加或删除该特定作业的供应范围……
不过我有个问题。
GET上的页面加载了数据库中的所有正确信息。在页面的底部,我有一个表对象,其中每一行都是一个供应范围,并且在每一行的末尾以编程方式添加了一个按钮,用于从作业中删除该范围,并调用接收模型的控制器中的操作,从模型内的列表对象中删除项目,然后返回带有修改后的模型的视图"EditJob“。
这对视图更新非常有效,我成功地从作业中图形化地删除了作用域...一旦我点击了Update Job按钮,虽然发生了一些非常奇怪的事情...
假设在我的表中,第一行是Scope01,第二行是Scope02…我在Scope01上按remove,视图将更新,只显示Scope02作为表中的唯一项,并且通过断点,我看到传递给视图的模型实际上包含正确的数据。
一旦我按下update job,按钮从submit调用的动作POST EditJob就会收到一个模型,该模型是正确的,但作用域列表只有一个项,这是它应该有的项,但是错误的项,它只有我删除的那个项!到底发生了什么?我不明白..。
这是我视图中tble的标记和c#:
@if (Model.Data.JobScopes.Any())
{
<table class="card-table table table-striped">
<thead>
<tr>
<th scope="col">ID in SQL</th>
<th scope="col">Descrizione</th>
</tr>
</thead>
<tbody>
@for (int i = 0; i < Model.Data.JobScopes.Count; i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model.Data.JobScopes[i].Id)
@Html.HiddenFor(modelItem => Model.Data.JobScopes[i].Id)
</td>
<td>
@Html.DisplayFor(modelItem => Model.Data.JobScopes[i].Description)
@Html.HiddenFor(modelItem => Model.Data.JobScopes[i].Description)
</td>
<td>
<button asp-controller="JobAdministration" asp-action="RemoveScopeFromJobOnEdit" asp-route-id="@i" type="submit" class="btn btn-danger">Rimuovi</button>
</td>
</tr>
}
</tbody>
</table>
}这是我的删除作用域操作:
[HttpPost]
public IActionResult RemoveScopeFromJobOnEdit(int Id, EditJobViewModel model)
{
model.Data.JobScopes.RemoveAt(Id);
return View("EditJob", model: model);
}这是最终的post操作,它实际更新了数据库中的作业:
[HttpPost]
public async Task<IActionResult> EditJob(EditJobViewModel model)
{
if (ModelState.IsValid)
{
var job = await DbContext.Jobs.FindAsync(model.Data.JobId);
if (job == null)
{
ViewBag.ErrorMessage = $"La commessa con l'ID = {model.Data.JobId} non è stata trovata";
return View("NotFound");
}
else
{
job.JobId = model.Data.JobId;
job.JobName = model.Data.JobName;
job.JobDescription = model.Data.JobDescription;
foreach (var modelScope in model.Data.JobScopes)
{
if (!DbContext.JobScopes.Where(scope => (scope.JobId == model.Data.JobId) && (scope.ScopeId == modelScope.Id)).Any())
{
var scope = await DbContext.Scopes.FindAsync(modelScope.Id);
DbContext.JobScopes.Add(new JobScope
{
JobScopeDescription = modelScope.Description,
ScopeId = modelScope.Id,
Scope = scope,
JobId = job.JobId,
Job = job
});
}
}
foreach (var dbScope in DbContext.JobScopes.Where(scope => scope.JobId == model.Data.JobId))
{
if (!model.Data.JobScopes.Where(scope => (scope.Id == dbScope.ScopeId)).Any())
{
DbContext.Remove(dbScope);
}
}
DbContext.Jobs.Update(job);
var result = await DbContext.SaveChangesAsync();
if (result > 0)
{
return RedirectToAction("ListJobs", "JobAdministration");
}
else
{
ModelState.AddModelError("", "L'operazione di aggiornamento è fallita!");
}
}
}
return View(model);
}忽略少量的意大利文字,它们只是视觉辅助。
感谢您的帮助!:)
发布于 2020-07-06 21:42:54
我设法解决了这个问题,但我不知道这是不是可取的解决方案。
我使用TempData属性来序列化和反序列化我抛出的模型,它似乎修复了之前发生的各种恶作剧……
这是一个有效的解决方案吗?
https://stackoverflow.com/questions/62752593
复制相似问题