用户控制和会话管理问题

时间:2012-02-27 11:19:50

标签: c# asp.net user-controls attachment

我为我的团队开发了一个附件控件。 该控件位于一个单独的项目中。

每当我在附件用户控件中上传文件时,我都会将这些附件(文档)放入会话中。 只有当我保存时,我从会话中获得了这些附件并保存在DB中。

现在,我的团队告诉我,页面中可能有两个或更多附件。 由于我把这些放在会议中,我再也无法处理了。

我该如何处理? 使用会话是一个糟糕的选择?在我保存之前,我不知道把这些附件放到哪里。

任何建议对我都有好处。

提前多多感谢。

2 个答案:

答案 0 :(得分:1)

您应该使用视图状态(或控制状态)来跟踪控件的状态。这允许您在同一控件的多个实例中对state-bag使用相同的键。在您的情况下,您应该将实际文档内容(文件)存储在具有随机唯一名称(例如guid)的临时可配置目录中,并在视图状态中保留此随机名称和原始名称(以及更多属性,如果有)。保存时,将内容从文件系统移动到DB(并删除这些文件)。

如果您不想更改现有代码,则可以继续使用Session作为存储,但每个控件实例生成会话密钥。例如,如果您使用"MyFile"作为会话的关键字,那么请开始使用"MyFile_" + Control.ClientID作为会话数据的关键字 - 这样您就可以在每页上设置多个实例。
更健壮的会话密钥方式是在每个控制实例中生成一个唯一密钥(guid),并将该密钥保存在视图状态中。

答案 1 :(得分:0)

首先,将数据存储在内存中可能不是一个好主意,因为根据情况,这可能会严重增加内存占用。例如,您可以将它们存储在临时文件夹或数据库中,但将它们标记为未保存。您可以使用某些标识符来区分不同会话中的不同附件(例如,创建一个名为SessionID的子文件夹,或使用包含SessionID,FileName,Data或类似列的表)。这样,处理多个附件可能更容易:如果用户上传文件,只需将其添加到文件夹/表中即可。要列出所有上载的附件,请列出SessionID文件夹中的所有文件,或列出具有正确SessionID列的所有数据库行。

这只是一个草图,因为我不知道你的具体情况或要求。