我想存储一些将在整个生命周期中引用的变量,从PreInit事件中的db访问开始。 ViewState不是一个选项,因为如果在页面生命周期中如此早地保存它,它将不会持久存在。鉴于用户不应更改数据,最佳替代方案是什么?
答案 0 :(得分:2)
您可以使用会话来存储您的数据。我不确定您系统的用户数量,但假设您要存储的数据很小,这不会有问题。'
此外,除非您使用SessionPageStatePersister(或其他服务器端persister)或加密ViewState,否则用户仍可以更改ViewState。它可能更难,但仍有可能。默认情况下,ViewState使用HiddenFieldPageStatePersister,它将ViewState存储在每个页面的隐藏字段中(作为编码字符串)。值得考虑的事情。
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以将数据存储在隐藏字段中,如果您想隐藏它,可以使用某种类型的编码。当然,这些值也只会在页面生命周期的后期加载。会话对象将是显而易见的选择,尽管并不是每个人都喜欢的方法。
答案 3 :(得分:0)
会话可能在PreInit中不可用,但您可以将它们存储在变量中,直到更晚的页面生命周期任务,然后将它们存储在会话中。关于会话功能我可能错了。此外,缓存是一个选项,但缓存不是用户特定的;您可以通过附加其用户ID或会话ID来使其成为用户特定的。
答案 4 :(得分: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引擎在正常情况下构建会话,从而可以尽早使用它。
在会话(或应用程序)之外,您还有另外两个选项:客户端存储和持久存储。后者是一种说法“将其填入数据库中”的一种奇特方式,当然,存在类似的替代方案。
客户端存储就像viewstate,但更受控制。您可以使用隐藏字段或cookie。事实上,cookie可能对您有用,但如果您希望用户不管它,您需要加密其中的信息。无论如何,您发送给客户端的任何内容都必须受到损害,因此请务必进行有效性检查。