【问题标题】:building dynamic controls on postback (asp.net)在回发 (asp.net) 上构建动态控件
【发布时间】:2010-01-17 11:41:23
【问题描述】:

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

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

例如采用经典的“问卷调查”场景...question.aspx?id=1

  1. 从查询字符串中获取 id
  2. 从任何地方加载问题并动态构建控件, 或动态添加每个问题 用户控制多少 问题等
  3. 页面回帖(我猜是用户按下提交!)
  4. 在初始化事件中...您应该在哪里已经将 id 存储到 重新创建问题控件?

到目前为止我尝试过/想到的事情:

  • 我最初将值存储在 视图状态,因为它与 页面,但视图状态值不是 在页面初始化中可用(或者它是什么??)
  • 一个隐藏变量,然后访问表单集合中的值
  • 会话 - 我不想使用会话,似乎有问题,例如如果用户查看了两份问卷怎么办?
  • 又是查询字符串?但这似乎太容易改变了,动态控件就没有意义了……
  • 在控件本身中?例如一起忽略问卷ID,然后简单地关闭问题ID吗?假设控件 ID 将采用某种格式,例如 controlQ#,例如控制Q1,控制Q2。这意味着每个问题的 ID 必须是唯一的

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      contols-id: 是的,你必须给他们唯一的 id,否则它将不起作用。如果您将问题存储在数据库中,则为此使用数据库主键应该没有任何问题,因此将它们命名为例如问题 1、问题 2(控件)

      【讨论】:

      • 如果我在 onLoad 事件中创建它们,我必须手动恢复回发值是否正确,如果我在 init 事件中创建它们,它们会自动恢复?跨度>
      • 我们还在谈论用户控件吗?您不必手动恢复回发值。这是自动完成的。但要做到这一点,框架首先需要知道你的控件。如果您在 aspx 中声明了控件,则框架将为您完成这项工作。但是如果您在生命周期(也称为动态)期间添加控件,那么您也必须在回发中执行此操作。
      • 假设您在第一个请求中添加(获取)地址控件到您的占位符。用户填写一些字段(街道、城市..)。在回发时,框架会将 postdata 分配给控件。如果现在没有与第一步中设置的 id 的控件,您将得到一个异常。如果在处理回发数据之前添加控件,框架可以找到控件并添加数据。在此之后,您可以以正常方式处理您的页面(保存数据等)。完成此任务后,您可以更改控件,因此也许您删除地址控件并添加电话继续
      猜你喜欢
      • 2011-05-12
      • 2018-09-28
      • 2011-08-24
      • 2017-07-22
      • 2011-03-07
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多