ASP.NET MVC 3.0 - 维护模型状态

时间:2012-02-13 11:49:01

标签: asp.net-mvc-3

ASP.NET MVC 3.0的新手。请求专家对下面提到的场景进行观察。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

  

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

**有两个原因

  1. The first and most important rule is 'don't trust user data'.
  2. 并发并避免保存旧数据。 See this example
  3. 我建议使用隐藏字段来记录LastUpdateDateTime和客户ID,而不是使用Session,它将在模型中回发以检索记录并验证具有数据库记录的LastUpdatedtime

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

我的选择总是第一个。 :)