在ASP.NET MVC中在回发之间保留复杂数据

时间:2010-03-25 03:39:06

标签: asp.net-mvc asp.net-mvc-2

我正在开发一个ASP.NET MVC 2应用程序,它连接到某些服务以进行数据检索和更新。这些服务要求我在更新数据时提供原始实体以及更新的实体。这样做可以改变跟踪和乐观并发。服务无法更改。

我的问题是我需要以某种方式在回发之间存储原始实体。在WebForms中,我会使用ViewState,但从我读过的内容来看,这就是MVC。原始值不必是防篡改证明,因为服务将它们视为不可信。实体将是(最大)1k,它是一个内联网应用程序。

我提出的选择是:

  1. 会话 - 排除 - 将实体存储在会话中,但我不喜欢这个想法,因为没有计划在
  2. 之间共享会话
  3. 网址 - 排除了 - 数据太大
  4. HiddenField - 将序列化实体存储在隐藏字段中,可能带有加密/编码
  5. HiddenVersion - 实体上有一个(SQL)版本字段,我可以将其放入隐藏字段中。然后在保存中,我从服务中获取“原始”实体并比较版本,进行自己的乐观并发。
  6. Cookie - 与3或4相同,但使用Cookie代替隐藏字段
  7. 我倾向于选项4,尽管3会更简单。这些有效的选择还是我走错了路?有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

我不太清楚为什么会话是个坏主意,如果客户端不需要备份副本,那么保持服务器内存中的整个内容听起来最好;因为其余的候选人都是从服务器发送到临时客户端的浏览器,然后在客户端执行任何操作时将其恢复。情况是,每当客户端ping回来,服务器将解压缩编码数据(隐藏字段,cookie,URL等),并可能再次放入服务器!它也浪费了带宽IMO。

好的,如果客户端需要(检查)备份,我会考虑隐藏字段(设置)或简单地将数据序列化为XML并将其放在HTML中的某个位置。

修改

我仍然投票支持Session。如果您打算照顾服务器场,请考虑实现跨服务器会话提供程序:

http://msdn.microsoft.com/en-us/library/ms178587%28VS.80%29.aspx

并将状态存储在数据库中。

答案 1 :(得分:1)

如果您将其存储在会话中,则需要确保在实现Web场时正确加载会话。

目前我们已经(完全)有相同的问题,我们决定要实现存储库模式并将其链接到cookie。

然后,如果这成为一个问题,我们可以简单地插入会话管理器,数据库管理器或其他任何东西,由于存储库模式,我们的代码甚至不需要知道。

我们对隐藏字段的想法进行了修改,但它感觉太像ViewState,我们都在WebForms中讨厌它,所以这个想法被废弃了。但不仅仅是因为我们讨厌观看状态。按Ctrl F5时出现问题。内容将被清除,然后你做什么?

所以在这一点上它的存储库模式带有一个可能会改变的cookie,但是实现本身就可以改变。

修改

我们还决定不使用隐藏字段,因为要对它们进行更改太容易了,所以你需要从服务器做一些令牌来确保它不会被篡改。

隐藏的字段一直在增加本质上应该是一个非常简单的问题的复杂性。

至少那是我们对此事的想法。