【问题标题】:ASP.NET MVC 3.0 - Maintain model stateASP.NET MVC 3.0 - 维护模型状态
【发布时间】:2012-02-13 11:49:00
【问题描述】:

我是 ASP.NET MVC 3.0 的新手。请求专家对以下场景的看法。

我有一个客户详细信息页面,其中只有名称是可编辑的。还有 10 个其他客户属性不可编辑并使用 SPAN 显示。当用户提交页面时,我只需要更新名称。

如果使用 EF,我将不得不再次加载客户,覆盖名称然后保存。否则我将不得不在某个地方维护客户模型。

有人尝试过使用会话 ID 缓存模型(或视图模型)吗?这是一个好习惯吗?

【问题讨论】:

  • 我不确定你到底在问什么。
  • 让我尝试更具描述性:我有一个客户详细信息视图,其中显示了一条客户记录,只有名称是可编辑的。还有其他客户详细信息,例如电子邮件、电话等,它们是不可编辑的,并且使用 span 显示在视图中。当用户编辑名称并提交页面时,模型会尝试更新数据库中客户的详细信息。

标签: asp.net-mvc-3


【解决方案1】:

你的想法几乎是正确的。

如果使用 EF,我将不得不再次加载客户,覆盖名称然后保存。否则我将不得不在某个地方维护客户模型。

在更新方法中**再次加载客户并根据需要更新名称,然后保存

**有两个原因

  1. The first and most important rule is 'don't trust user data'.
  2. 并发和避免保存旧数据。 See this example

我会建议使用隐藏字段来记录 LastUpdateDateTime 和客户 ID,而不是使用 Session,这些字段将被回发到模型中以检索记录并使用数据库记录验证 LastUpdatedtime

【讨论】:

    【解决方案2】:

    通常,您应该使用不同于数据库模型的视图模型。话虽如此,在您当前的情况下,情况非常简单,只需将名称提交给控制器,然后使用提交的名称设置您从 EF 获得的对象的 Name 属性。

    缓存视图模型或模型不是您关心的问题。数据库模型缓存由 EF 处理,您的问题主要是缺乏清晰的应用程序分层。事实上,我强烈建议多了解一点 MVC 模式、基本应用程序架构(2-3 层)以及何时以及如何使用 OR\M(即 EF)。

    【讨论】:

      【解决方案3】:

      对表单中的其他属性使用隐藏输入。通过这种方式,您可以将所有属性绑定到您的 EF 实体,而无需再次从 db 获取实体。

      @Html.DisplayFor(model=>model.x)
      @Html.HiddenFor(model=>model.x)
      

      或者您可以序列化实体(如果您使用 POCO 实体)并设置为隐藏输入。当您回发时,您应该反序列化实体。

      我的选择永远是第一个。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多