2010-10-28 86 views
2

我想存储一些变量,这些变量将在整个生命周期中被引用,从PreInit事件中的db访问开始。 ViewState不是一个选项,因为如果在页面生命周期中这么早保存,ViewState将不会保留。由于数据不应该被用户改变,那么最好的选择是什么?ViewState的替代方案

回答

2

您可以使用会话来存储您的数据。我不确定你系统的用户数量,但假设你想存储的数据很小,这不会是一个问题。'此外,除非您使用SessionPageStatePersister(或其他服务器端持久存储器)或加密ViewState,否则用户仍可能更改ViewState。这可能会更困难,但仍然有可能。默认情况下,ViewState使用HiddenFieldPageStatePersister,并将ViewState存储在每个页面的隐藏字段中(作为编码字符串)。只是值得考虑的事情。

+0

会议将是我最后的手段,虽然看起来我没有选择。 ViewState默认情况下是加密的,所以它是可以改变的,但是如果没有机器密钥则不可能一致。我接受你的答案,因为它是第一个,虽然每个人都说会话。 – Shagglez 2010-10-28 14:52:31

0

根据范围:SessionApplication

会议
如果你想每个用户存储的数据

应用
如果你想存储适用于所有用户的数据

0

您可以将数据存储在隐藏字段中,如果您想隐藏它,那么您可以ld使用某种咒语。当然,这些值也只会在页面生命周期的后期阶段加载。会话对象将是明显的选择,尽管这不是每个人都喜欢的方法。

0

会话可能在PreInit中不可用,但您可以将它们存储在变量中,直到稍后的页面生命周期任务,然后将它们存储在会话中。我可能会错误的会话功能。此外,缓存是一个选项,但缓存不是用户特定的;您可以通过附加他们的用户ID或会话ID来使其成为特定用户。

0

会议可能是你最好的选择。我们必须使用会话来存储一些用户信息,但由于访问得太早而出现了一个错误。该错误是[HttpException]: Session state has created a session id, but cannot save it because the response was already flushed by the application."但它通常会显示为PageRequestMangerParserErrorException。超级好玩的狩猎下来。一个hackish的解决方法是编写到您的Global.asax代码背后:

public Session_Start(object sender, EventArgs e) 
{ 
    string sessionId = Session.SessionID; 
} 

访问的SessionID强制ASP.NET引擎去它通常会之前建立的会话,从而能够及早使用它。

在会话(或应用程序)之外,您有两个其他选项:客户端存储和永久存储。后者是一种奇特的说法:“把它塞入数据库中”,当然也有类似的选择。

客户端存储与查看状态相似,但更受控制。您可以使用隐藏字段或Cookie。事实上,一个cookie可能适合你,但如果你想让用户独立,你需要加密其中的信息。无论如何,您发送给客户的任何内容都必须承担妥协,因此请始终进行有效性检查。