8

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

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

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

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

谢谢你的帮助。

4

8 回答 8

9

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

  • 初始化(初始化事件)
  • 开始跟踪视图状态(检查是否回发)
    • 加载视图状态(如果回发)
    • 加载回发数据(如果回发)
  • 加载(加载事件)
    • 引发更改的事件(如果回发)
    • 引发回发事件(如果回发)
  • PreRender(预渲染事件)
  • 保存视图状态
  • 使成为
  • 卸载(卸载事件)
  • 处置

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

于 2008-09-19T15:07:26.357 回答
3

我昨天发现,您实际上可以通过在 loadviewstateevent 触发后立即加载控件树来使您的应用程序正常工作。如果您覆盖 loadviewstate 事件,调用 mybase.loadviewstate,然后在其后放置您自己的代码以重新生成控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用视图状态字段来保存可用于重新创建这些控件的 ID 或数组信息。

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
于 2009-07-16T13:19:13.893 回答
2

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

于 2008-09-19T14:56:18.257 回答
1

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

Private dynControl As ASP.MyNamespace_MyControl_ascx

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

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
于 2008-09-19T15:08:13.220 回答
0

您必须在 Page_PreInit 事件处理程序中创建您的控件。ASP.NET 服务器控制模型很棘手;您必须完全了解页面生命周期才能正确执行此操作。

于 2008-09-19T14:58:40.560 回答
0

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

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

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

于 2008-09-19T15:01:15.640 回答
0

我们经历过同样的事情,并通过在 page_load 上使用具有完全相同 .ID 的幽灵控件来处理它,然后回发获取事件和数据。正如其他人所说,在初始化阶段之后动态添加控件,状态已经构建,之后添加的控件没有存储。

希望这个对你有帮助。

于 2008-09-19T15:14:04.110 回答
0

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

于 2009-05-04T21:54:09.727 回答