【问题标题】:ASP.NET MVC with EF page loses model data after post via return View()带有 EF 页面的 ASP.NET MVC 在通过 return View() 发布后丢失模型数据
【发布时间】:2020-11-18 10:12:41
【问题描述】:

我正在从一本书中学习带有实体框架的 ASP.NET MVC,下面的示例是一个“删除”视图,其中列出了汽车的详细信息作为用户删除的确认页面。

单击删除链接后,表单将再次发布到绑定 Id 和时间戳的删除操作,然后尝试删除。如果删除因异常而失败,则会将错误添加到 ModelState,并向用户显示显示错误的相同删除视图。

删除 post 操作:(get 版本,此处省略,只是通过 Id 检索模型对象并显示下面的第一张图片)

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult Delete([Bind(Include = "Id,Timestamp")] Inventory inventory)
        {
            
            try
            {
                _repo.Delete(inventory);
            }
            catch (DbUpdateConcurrencyException ex)
            {
                
                ModelState.AddModelError(string.Empty, $@"Unable to delete record. Another user updated the record. {ex.Message}");
                return View(inventory);
            }
            catch (Exception ex)
            {
                
                ModelState.AddModelError(string.Empty, $@"Unable to delete record: {ex.Message}");
                return View(inventory);
            }

            return RedirectToAction("Index");
        }

问题是,如果删除操作确实因异常而失败,则即使通过返回View(inventory)再次传递,页面也会丢失模型数据(库存)

如何在保留模型数据的同时显示错误页面?

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework


    【解决方案1】:

    您只绑定了 ID 和 Timestamp 属性。因此,传递给您的 post 操作的 Inventory 对象仅包含这些值。
    当然,当代码返回同一个对象时,您的视图将无法显示其他属性。

    您可以简单地删除 Bind attribute 并且应该在您的发布操作中获取整个库存数据,或者可能是更好的选择,继续使用 Bind 属性,但如果出现异常,请在返回之前重新加载 Inventory 对象到你的视野。

    【讨论】:

    • 啊谢谢!我是新来的,认为上一个确认页面中的“库存”对象仍然会持续到下一页。没有意识到它必须从头开始重建。
    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2010-10-31
    • 2016-11-25
    • 2011-03-12
    相关资源
    最近更新 更多