首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.Net Core 3.1查看开机自检时的模型更改

ASP.Net Core 3.1查看开机自检时的模型更改
EN

Stack Overflow用户
提问于 2020-07-06 17:00:30
回答 1查看 52关注 0票数 0

我手上有个很特别的问题...

我正在为我的公司编写一个管理webApp,用于管理工作、时间表和其他一堆事情……

我有一个视图,我可以在其中编辑SQLite数据库中以前插入的作业,并且我可以添加或删除该特定作业的供应范围……

不过我有个问题。

GET上的页面加载了数据库中的所有正确信息。在页面的底部,我有一个表对象,其中每一行都是一个供应范围,并且在每一行的末尾以编程方式添加了一个按钮,用于从作业中删除该范围,并调用接收模型的控制器中的操作,从模型内的列表对象中删除项目,然后返回带有修改后的模型的视图"EditJob“。

这对视图更新非常有效,我成功地从作业中图形化地删除了作用域...一旦我点击了Update Job按钮,虽然发生了一些非常奇怪的事情...

假设在我的表中,第一行是Scope01,第二行是Scope02…我在Scope01上按remove,视图将更新,只显示Scope02作为表中的唯一项,并且通过断点,我看到传递给视图的模型实际上包含正确的数据。

一旦我按下update job,按钮从submit调用的动作POST EditJob就会收到一个模型,该模型是正确的,但作用域列表只有一个项,这是它应该有的项,但是错误的项,它只有我删除的那个项!到底发生了什么?我不明白..。

这是我视图中tble的标记和c#:

代码语言:javascript
复制
@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>
}

这是我的删除作用域操作:

代码语言:javascript
复制
[HttpPost]
public IActionResult RemoveScopeFromJobOnEdit(int Id, EditJobViewModel model)
{
    model.Data.JobScopes.RemoveAt(Id);

    return View("EditJob", model: model);
}

这是最终的post操作,它实际更新了数据库中的作业:

代码语言:javascript
复制
[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);
}

忽略少量的意大利文字,它们只是视觉辅助。

感谢您的帮助!:)

EN

回答 1

Stack Overflow用户

发布于 2020-07-06 21:42:54

我设法解决了这个问题,但我不知道这是不是可取的解决方案。

我使用TempData属性来序列化和反序列化我抛出的模型,它似乎修复了之前发生的各种恶作剧……

这是一个有效的解决方案吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62752593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档