生命周期中的ASP.NET隐藏字段持久性

时间:2012-09-11 12:54:47

标签: asp.net events client-server page-lifecycle

我觉得我可能在这里忽略了页面生命周期的基本概念,并且(因为我无法弄清楚正确的关键字或者没有被问到)无法找到现有的答案所以请原谅我。

基本上,我需要在客户端和服务器端之间保留一个可变对象。由于viewstate是加密/序列化的,并且会话状态只是服务器端,我的解决方案是使用隐藏字段 - 这很简单,对吧?那么这就是我的问题......看起来好像它正在工作,但数据没有像我预期的那样传播。

我的期望是:

  1. 首次加载页面。服务器端类识别隐藏字段为空,初始化容器类,将类序列化为JSON字符串并将该值写入隐藏字段。
    • Page_Init:不可用。
    • Page_Load:不可用。
    • Page_LoadComplete:可用。
  2. 服务器处理完成,对象现在可供客户端代码使用。
  3. 隐藏字段中的对象由客户端代码变异。然后,客户端代码将回发到服务器(通过按钮)。
  4. 服务器端处理开始......
    • Page_Init:不可用。
    • Page_Load:可用,包括客户端更改。
    • Page_LoadComplete:可用,包括客户端更改。
  5. 一切都在世界上,一道双色的光芒照在我的窗外,一只神奇的独角兽给了我一个眨眼和点头。
  6. 我的观察是:

    1. 首次加载页面。服务器端类识别隐藏字段为空,初始化容器类,将类序列化为JSON字符串并将该值写入隐藏字段。
      • Page_Init:不可用。 (正如所料)
      • Page_Load:不可用。 (正如所料)
      • Page_LoadComplete:可用。 (正如所料)
    2. 服务器处理完成,对象现在可供客户端代码使用。
    3. 隐藏字段中的对象由客户端代码变异。然后,客户端代码将回发到服务器(通过按钮)。
    4. 服务器端处理开始......
      • Page_Init:不可用。 (正如所料)
      • Page_Load:可用,但未通过客户端更改进行更新。 (意外)。
      • Page_LoadComplete:可用,包括客户端更改。 (正如所料)
    5. 在我的隔间上方形成一片乌云,我开始思考我的笔记本电脑是否可以在阳台下的第二层坠落中存活下来。
    6. 结论

      由于一些原因,这让我感到有些困惑......首先是我以前从未使用过“LoadComplete”事件,似乎无法找到任何表明它是必要的例子,甚至是它应该这样做。第二个是,在引发加载完成时,已经触发了依赖于客户端数据的其他事件。

      任何帮助/解释/建议;地狱,甚至批评赞赏!

      谢谢,杰森

3 个答案:

答案 0 :(得分:2)

我正在回答这个问题,希望这有助于拯救别人几个小时。经过多次试验并最终获得成功后,我了解到您可以在OnInit事件期间获得HiddenField值。给定ID为hidValue的HiddenField,关键行为:

string strValue = Request.Form[hidValue.UniqueID].ToString();

答案 1 :(得分:1)

<强>释
您可以在javascript中更新HiddenField值并将其返回到服务器 如果您希望在Load之后您的对象可用,则使用LoadComplete即可 如果您希望此对象在加载时可用于所有控件,则最早可以通过重载PreLoad并在那里创建对象来从输入中获取数据。
你的逻辑没有问题。

<强>结论
你实施它有一些错误。
让我们现在看一下代码。

答案 2 :(得分:1)

我在ASP.NET生命周期中扯了很多头发:-)。我会建议你这个:

  • 绑定到控件事件
  • 避免绑定或覆盖页面 事件

在这种情况下,您应该在页面/用户控件中声明受保护的HiddenField。所以你真的想要绑定到ValueChanged event,而忘记其余的。