在回发上构建动态控件(asp.net)

时间:2010-01-17 11:41:23

标签: asp.net postback page-lifecycle dynamic-controls

我确信这已经得到了回答,但我找不到......也许是因为这些术语被用于许多不同的问题......无论如何。

如何在init事件中存储有关在回发等上构建动态控件的信息的最佳方式...

e.g。采取经典的“问卷调查”情景... question.aspx?id = 1

  1. 从查询字符串获取id
  2. 从任何地方加载问题并动态构建控件, 或动态添加每个问题 用户控制多少 问题等
  3. 回页(用户按下提交我猜!)
  4. 在init事件中...... 你应该在哪里已经存储了id 重新创建问题控件?
  5. 到目前为止我已经尝试/想过的事情:

    • 我最初将值存储在 viewstate因为它与...相关 页面,但viewstate值不是 在页面init中可用(或者它是??)
    • 隐藏变量,然后访问表单集合中的值
    • 会话 - 我不想使用会话,似乎有问题,例如如果用户查看两份问卷怎么办?
    • 再次查询?但这似乎太容易改变,动态控制也没有意义......
    • 在控件本身?例如无视问卷调查ID所有在一起,只是简单地关掉问题ID?假设控制ID将采用某种格式,如controlQ#,例如controlQ1,controlQ2。这意味着每个问题ID必须是唯一的

    任何帮助/指导等非常感谢!!!

2 个答案:

答案 0 :(得分:1)

在回发期间,查询字符串仍然可用,因此您可以从那里获取ID。

如果您担心用户操纵查询字符串参数,那么您可能应该添加一些其他参数,以便在回发期间验证查询字符串的正确性。举个简单的例子,您可以添加ID参数的MD5哈希值和当前会话的ID,并在回发期间重新创建/比较该校验和。

答案 1 :(得分:0)

尝试在页面OnLoad中创建/加载用户控件。 如果要在usercontrol中加载其他usercontrol,请使用OnInit事件。

使用viewstate来持久保存在回发期间重新实例化用户控件所需的信息。要将回发数据映射到controltree,您必须确保拥有相同的控制树。在该映射之后,您可以更改您的controltree(加载一些其他控件,例如。)

contols-id:是的,你必须给它们唯一的ID,否则它将无效。如果您将问题存储在数据库中,那么使用数据库主键就不会有任何问题,因此请将它们命名为例如问题1,问题2(控制)