我觉得我可能在这里忽略了页面生命周期的基本概念,并且(因为我找不到正确的关键字或没有被问到)无法找到现有答案,所以请原谅这已经被问到了。
基本上,我需要在客户端和服务器端之间保留一个可变对象。由于viewstate是加密/序列化的,并且会话状态仅是服务器端的,所以我的解决方案是使用隐藏字段-很容易,对吧?好吧,这是我的问题……似乎可以正常工作,但是数据没有像我预期的那样传播。
我的期望是:
页面是第一次加载。服务器端类识别出隐藏字段为空,初始化容器类,将类序列化为JSON字符串,然后将该值写入隐藏字段。
Page_Init:不可用。
Page_Load:不可用。
Page_LoadComplete:可用。
服务器处理完成,对象代码现在可供客户端代码使用。
隐藏字段中的对象由客户端代码突变。然后,客户端代码(通过按钮)将回发到服务器。
服务器端处理开始...
Page_Init:不可用。
Page_Load:可用,包括客户端更改。
Page_LoadComplete:可用,包括客户端更改。
世间万事大吉,双彩虹照在我的窗外,一只神奇的独角兽使我眨了眨眼睛。
我的观察是这样的:
页面是第一次加载。服务器端类识别出隐藏字段为空,初始化容器类,将类序列化为JSON字符串,然后将该值写入隐藏字段。
Page_Init:不可用。 (如预期)
Page_Load:不可用。 (如预期)
Page_LoadComplete:可用。 (如预期)
服务器处理完成,对象代码现在可供客户端代码使用。
隐藏字段中的对象由客户端代码突变。然后,客户端代码(通过按钮)将回发到服务器。
服务器端处理开始...
Page_Init:不可用。 (如预期)
Page_Load:可用,但未通过客户端上的更改进行更新。 (意外)。
Page_LoadComplete:可用,包括客户端更改。 (如预期)
小隔间上形成了乌云,我开始考虑我的笔记本电脑是否能从第二层掉下的阳台上幸存下来。
结论
由于以下几个原因,这使我有些困惑……首先是我以前从未使用过“ LoadComplete”事件,并且似乎找不到任何表明有必要甚至应该表明它是必要的示例。那样做。第二个问题是,在完成负载的时间增加时,依赖于客户端数据的其他事件已经被触发。
任何帮助/解释/建议;地狱,甚至批评受到赞赏!
谢谢,杰森
最佳答案
讲解
您可以在javascript中更新HiddenField
值,然后将其重新返回到服务器。
如果希望对象在Load
之后可用,则可以使用LoadComplete
。
如果希望此对象在加载时可用于所有控件,则最早可以从输入获取数据的方法是重载PreLoad
并在那里创建对象。
您的逻辑没有问题。
结论
您的实现中存在一些错误。
现在让我们看一下代码。