2012-02-13 90 views
0

ASP.NET MVC 3.0新增功能。请求专家对下面提到的方案的看法。ASP.NET MVC 3.0 - 维护模型状态

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

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

任何人尝试使用会话ID缓存模型(或viewmodel)?这是一个好习惯吗?

+1

我不确定你到底在问什么。 – 2012-02-13 11:51:33

+0

让我试着更具描述性:我有一个客户详细信息视图,显示一个客户记录,只有名称可编辑。还有其他客户详细信息,例如电子邮件,电话等,这些信息是不可编辑的,并使用跨度显示。当用户编辑名称并提交页面时,模型会尝试更新数据库中客户的详细信息。 – user1206686 2012-02-13 12:14:25

回答

1

你几乎在正确的方向思考。

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

在更新方法**恢复客户一次仅在需要时再保存

**有2个原因

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

而不是使用会话,我会建议使用隐藏字段备案LastUpdateDateTime和用户ID将在模型调回检索记录,并与数据库记录验证LastUpdatedtime

0

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

缓存视图模型或模型不是你关心的问题。数据库模型缓存由EF处理,您的问题主要是缺乏明确的应用程序分层。事实上,我强烈建议学习更多关于MVC模式,基本应用程序体系结构(2-3层)以及何时以及如何使用OR \ M(EF是)的信息。

0

采用隐藏式输入,用于其他属性在你的形式。通过这种方式,您可以获得绑定到EF实体的所有属性,并且不需要从数据库再次获取实体。或者您可以序列化实体(如果您使用POCO实体)并设置为隐藏输入。当你回发你应该反序列化实体。

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