3

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

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

我的期望是这样的:

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

我的观察是这样的:

  1. 第一次加载页面。服务器端类识别隐藏字段为空,初始化容器类,将类序列化为 JSON 字符串并将该值写入隐藏字段。
    • Page_Init:不可用。(正如预期的那样)
    • Page_Load:不可用。(正如预期的那样)
    • Page_LoadComplete:可用。(正如预期的那样)
  2. 服务器处理完成,对象现在可供客户端代码使用。
  3. 隐藏字段中的对象被客户端代码改变。客户端代码然后触发回发到服务器(通过按钮)。
  4. 服务器端处理开始...
    • Page_Init:不可用。(正如预期的那样)
    • Page_Load:可用,但不会随着客户端所做的更改而更新。(意外)。
    • Page_LoadComplete:可用,包括客户端更改。(正如预期的那样)
  5. 一团乌云笼罩着我的小隔间,我开始思考我的笔记本电脑能否在二楼从阳台上掉下来的情况下幸存下来。

结论

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

任何帮助/解释/建议;地狱,即使是批评也值得赞赏!

谢谢,杰森

4

3 回答 3

2

我正在回答这个问题,希望这有助于为其他人节省几个小时。经过多次尝试并最终成功,我了解到您可以在 OnInit 事件期间获取 HiddenField 值。给定一个 ID 为 hidValue 的 HiddenField,关键行是:

string strValue = Request.Form[hidValue.UniqueID].ToString();
于 2014-01-07T11:58:20.470 回答
1

说明
您可以更新HiddenFieldjavascript 中的值并将它们取回服务器。
如果您希望您的对象在 之后可用Load,则可以使用LoadComplete
如果您希望此对象在加载时可供所有控件使用,则最早可以从输入中获取数据的方法是通过重载PreLoad并在那里创建对象。
你的逻辑没有问题。

结论
您的实现中存在一些错误。
现在让我们看一下代码。

于 2012-09-11T13:19:46.163 回答
1

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

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

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

于 2012-09-11T13:48:32.967 回答