1

我在一家新公司工作,正在为 Web 应用程序 (.Net/4.0) 构建一个向导。用户在向导过程中会转到几个单独的屏幕,并且必须在向导完成之前返回到原始屏幕。这与他们通常的做法不同。但这就是要做的事情。

一种选择是将每个面板的结果存储在数据库的主屏幕中。那么,当用户离开并重定向回来时。我可以检查查询字符串,然后调用数据读取器并适当地填充原始值。

我选择的选项:我创建了一个对象,并将用户输入的结果存储到其中。当用户离开并重定向回来时,通过查询字符串检查并通过 BO 填充控制值。

我将对象存储在其中HttpContext.Current.Session.Item("BO")并调用它。

我的问题是,这是一种不好的做法吗?如果这不是我想做的事情以确保从会话中删除该对象,无论用户何时退出向导。如果不好,你会怎么做?我不怕建设性的批评,我对此很陌生。

4

2 回答 2

2

我已经使用该Session对象做了类似的事情。至于性能(序列化)和类似的事情,我不得不根据具体情况说,如果您的自定义类很大并且包含多个其他自定义类,那么序列化可能会有所帮助,但如果它们相对较小并且只包含原始数据类型,那么序列化可能会过度杀戮,并且很快就会适得其反。

至于控制对象在会话中停留的时间,您已经说过,为了完成向导,他们必须返回到起始页面或控制器页面或任何您想要调用的页面。因此,我认为当他们单击“保存”或“完成”时,您可以在保存功能的末尾添加一行Session("BO") = nothing(或Session.Remove("BO")将完成相同的操作),这会从Session容器中释放对象。如果您想在完成向导之前在他们离开页面时清除会话,那么这可能会有点麻烦。至于失去连接和超时之类的事情,

但不必担心我过去所做的是确保每次向导启动时都会清除Session我计划使用的成员,如果它还没有nothing,然后使用新对象重新创建它。

Session方法或该viewstate方法的唯一问题是两者都不是特别安全,因此如果您正在处理敏感数据,您可能希望加密存储在Session.

当我第一次开始使用缓存和会话对象时,这篇文章帮助了我。 ASP.NET 中的缓存管理

于 2012-06-14T15:59:32.300 回答
1

如果向导都在同一个页面上,只是回发到向导的每个屏幕,您可以使用 viewstate 来实现这一点。这绕过了您提出的问题,即使用户离开向导,也可能使对象保持在会话中。

请参阅 msdn 上有关 viewstate 的以下文章: ASP.NET View State Overview

您还可以使用视图状态来存储特定于页面的应用程序数据。

不过,使用视图状态有一些注意事项。您不希望将大量数据通过管道传输到用户浏览器以进行状态管理。存储在视图状态中的类也必须是可序列化的。引用msdn文章:

视图状态信息被序列化为 XML,然后使用 base-64 编码进行编码,会产生大量数据。当页面发布到服务器时,视图状态的内容作为页面回发信息的一部分发送。如果视图状态包含大量信息,则会影响页面的性能。通过使用应用程序的典型数据来测试页面的性能,以确定视图状态的大小是否会导致性能问题。

...必须使用 Serializable 属性编译该类,以便可以序列化其值以用于视图状态。

有关使用 viewstate 的替代方法,请参阅 msdn 上的以下内容: ASP.NET State Management Recommendations

于 2012-06-14T13:01:17.890 回答