C# 用户控制和会话管理问题

C# 用户控制和会话管理问题,c#,asp.net,user-controls,attachment,C#,Asp.net,User Controls,Attachment,我为我的团队开发了附件控制。 控制在一个单独的项目中 每当我上传附件用户控件中的文件时,我都会将这些附件(文档)放在会话中。 只有在保存时,我才从会话中获取这些附件并保存到数据库中 现在,我的团队告诉我,一个页面中可以有两个或更多附件。 因为我把它们放在会议上,我再也不能处理它了 我该怎么处理? 使用会话是一个错误的选择?在保存之前,我不知道将这些附件放在哪里 任何建议对我都很好 非常感谢。首先,将数据存储在内存中可能不是一个好主意,因为根据具体情况,这可能会严重增加内存占用。例如,您可以将它们

我为我的团队开发了附件控制。 控制在一个单独的项目中

每当我上传附件用户控件中的文件时,我都会将这些附件(文档)放在会话中。 只有在保存时,我才从会话中获取这些附件并保存到数据库中

现在,我的团队告诉我,一个页面中可以有两个或更多附件。 因为我把它们放在会议上,我再也不能处理它了

我该怎么处理? 使用会话是一个错误的选择?在保存之前,我不知道将这些附件放在哪里

任何建议对我都很好


非常感谢。

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


这只是一个粗略的草图,因为我不知道您的具体场景或要求。

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

这只是一个粗略的草图,因为我不知道您的确切场景或需求。

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

如果您不想更改太多现有代码,则可以继续使用会话作为存储,但可以为每个控件实例生成会话密钥。例如,如果您使用
“MyFile”
作为会话的密钥,则开始使用
“MyFile”+Control.ClientID
作为会话数据的密钥-这将允许您每页有多个实例。
会话密钥更可靠的方法是在每个控件实例中生成一个唯一的密钥(guid),并将该密钥保存在视图状态中。

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

如果您不想更改太多现有代码,则可以继续使用会话作为存储,但可以为每个控件实例生成会话密钥。例如,如果您使用
“MyFile”
作为会话的密钥,则开始使用
“MyFile”+Control.ClientID
作为会话数据的密钥-这将允许您每页有多个实例。

会话密钥更可靠的方法是在每个控件实例中生成一个唯一的密钥(guid),并将该密钥保存在视图状态中。

我希望这是一个intranet应用程序。但除此之外,为什么一个页面上可能有多个附件是一个问题?不知道为什么可以有多个附件。我在公共团队,所以我不知道其他团队将如何使用它。我希望这是一个内部网应用程序。但除此之外,为什么一个页面上可能有多个附件是一个问题?不知道为什么可以有多个附件。我是一个普通的团队,所以我不知道其他团队会如何使用它。