ASP.Net:动态添加到占位符的用户控件无法检索值

时间:2008-09-19 14:53:16

标签: asp.net postback user-controls

我正在向PlaceHolder服务器控件动态添加一些用户控件。我的用户控件包含一些标签和一些文本框控件。

当我提交表单并尝试查看服务器上文本框(在每个用户控件中)的内容时,它们都是空的。

当回发完成时,文本框具有我在回发之前输入的数据。这告诉我框中的文本是通过ViewState保留的。我只是不知道为什么我在调试时找不到它们。

有人可以告诉我为什么我不会看到用户在服务器上输入的数据?

感谢您的帮助。

8 个答案:

答案 0 :(得分:9)

这是基于.NET v1事件序列,但它应该给你一个想法:

  • 初始化(初始化事件)
  • 开始跟踪视图状态(检查是否回发)
    • 加载视图状态(如果回发)
    • 加载回发数据(如果回发)
  • 加载(加载事件)
    • 提高更改的事件(如果回发)
    • 提出回发事件(如果回发)
  • PreRender(PreRender活动)
  • 保存视图状态
  • 渲染
  • 卸载(卸载事件)
  • 处置

如您所见,将ViewState数据加载回控件发生在Load事件之前。因此,为了使动态添加的控件“保留”这些值,它们必须存在以便ASP.NET页面首先重新加载值。在加载视图状态发生之前,您必须在Init阶段重新创建这些控件。

答案 1 :(得分:3)

我昨天想通过在loadviewstateevent被触发后立即加载控制树,你可以让你的应用程序正常工作。如果你覆盖loadviewstate事件,调用mybase.loadviewstate,然后把你自己的代码重新生成后面的控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用viewstate字段来保存可用于重新创建这些控件的ID或数组信息。

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

答案 2 :(得分:2)

我相信您需要在页面生命周期的Init阶段将UserControl添加到PlaceHolder,以便在Load阶段填充ViewState以读取这些值。这是你加载它们的顺序吗?

答案 3 :(得分:1)

确保您在类级别定义动态控件并将它们添加到ASP容器中:

Private dynControl As ASP.MyNamespace_MyControl_ascx

当您实例化控件时,请确保调用LoadControl以正确添加对象:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

答案 4 :(得分:0)

您必须在Page_PreInit事件处理程序中创建控件。 ASP.NET服务器控件模型很棘手;你必须完全理解page lifecycle才能做得对。

答案 5 :(得分:0)

正如其他人所说,任何形式的控制操作都必须在创建viewstate之前完成。

以下是页面生命周期中的一个很好的链接,可以帮助您:

http://msdn.microsoft.com/en-us/library/ms178472.aspx

答案 6 :(得分:0)

我们遇到了同样的事情,并通过使用具有完全相同.ID的page_load上的ghost控件来处理它,然后回发文件拾取事件和数据。正如其他人所说的那样,在init阶段之后动态添加控件已经建立了状态,并且没有存储后添加的控件。

希望这有点帮助。

答案 7 :(得分:0)

我还想补充说,我已经看到用户控件的工作方式与您期望的一样,只需在运行时设置Control.ID属性即可。如果您没有设置ID,则可能会以不同的顺序构建项目并且工作很奇怪。