2

我正在开发一个项目,其中页面根据可用索引加载某些控件。加载发生在调用 PopulateSearchField 方法的页面加载中。

在此方法中,所有 UserControl 都使用以下方法添加到页面上: Page.LoadControl("path");

页面加载和所有必需的控件都在页面上。我的问题是,当用户单击“搜索”按钮时,会触发事件,并根据这些控件中的用户输入构建查询。不幸的是,该方法无法生成正确的查询,因为它无法找到页面上的任何控件。

使用临时 ControlCollection 变量,我可以看到页面上的控件数量为 3,而应该是 4 到 10。集合中的这 3 个控件是页面上的静态标签和按钮。

我不知道代码是否有问题,或者是否是页面周期问题,因为该解决方案曾经在框架 1.1 上工作。是的,我知道这不是最好的做法,但他们就是这样做的,我必须让它发挥作用。

我不确定是否是导致问题的迁移。

非常感谢,大卫!

4

2 回答 2

1

当您单击该按钮时,在处理您的单击处理程序时,这些控件在服务器端不再可用。服务器端页面不知道您动态创建的控件,因为没有服务器端控件可用于映射到的发布值。如果要查找值,则需要检查发布的控件数据,而不是依赖服务器端 asp.net 控件层次结构。

您还可以通过 javascript 将所需的所有数据写入隐藏字段,然后读取隐藏数据服务器端,因为它将被发布。

正在发生以下情况:

  1. 动态创建控件
  2. 在点击时发布控件数据
  3. ASP.NET 将数据映射到它知道的现有控件。
  4. 未找到您的控件,因此数据未映射到任何内容。

您需要在映射发生之前添加控件(在 PreInit 中)。查看页面生命周期,您将看到它如何将所有控件和数据联系在一起。

于 2011-03-24T21:25:18.293 回答
0

当用户单击搜索时,您是否将控件重新添加到新页面?

请记住...每次用户点击您的服务器以访问该页面...Page都会创建一个新对象。如果您要动态添加控件,则必须在每次页面加载时都这样做。

此外,由于您似乎想从控件中获取值,因此您必须确保每次创建控件时使用完全相同的 ID 属性,并且如果您希望它们在加载视图状态之前创建保留他们的价值观。

于 2011-03-24T21:25:37.327 回答