我正在向 PlaceHolder 服务器控件动态添加一些用户控件。我的用户控件由一些标签和一些文本框控件组成。
当我提交表单并尝试查看服务器上文本框(在每个用户控件中)的内容时,它们是空的。
回发完成后,文本框会包含我在回发之前输入的数据。这告诉我,框中的文本正在通过 ViewState 保留。我只是不知道为什么我在调试时找不到它们。
有人可以告诉我为什么我看不到用户在服务器上输入的数据吗?
谢谢你的帮助。
我正在向 PlaceHolder 服务器控件动态添加一些用户控件。我的用户控件由一些标签和一些文本框控件组成。
当我提交表单并尝试查看服务器上文本框(在每个用户控件中)的内容时,它们是空的。
回发完成后,文本框会包含我在回发之前输入的数据。这告诉我,框中的文本正在通过 ViewState 保留。我只是不知道为什么我在调试时找不到它们。
有人可以告诉我为什么我看不到用户在服务器上输入的数据吗?
谢谢你的帮助。
这是基于 .NET v1 事件序列,但它应该给你的想法:
如您所见,将 ViewState 数据加载回控件发生在 Load 事件之前。因此,为了让您动态添加的控件“保留”这些值,它们必须存在于 ASP.NET 页面才能重新加载这些值。在加载视图状态发生之前,您必须在 Init 阶段重新创建这些控件。
我昨天发现,您实际上可以通过在 loadviewstateevent 触发后立即加载控件树来使您的应用程序正常工作。如果您覆盖 loadviewstate 事件,调用 mybase.loadviewstate,然后在其后放置您自己的代码以重新生成控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用视图状态字段来保存可用于重新创建这些控件的 ID 或数组信息。
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
MyBase.LoadViewState(savedState)
If IsPostBack Then
CreateMyControls()
End If
End Sub
我相信您需要在页面生命周期的 Init 阶段将 UserControl 添加到 PlaceHolder,以便让 ViewState 由 Load 阶段填充以读取这些值。这是您加载这些的顺序吗?
确保您在类级别定义动态控件并将它们添加到 ASP 容器中:
Private dynControl As ASP.MyNamespace_MyControl_ascx
当您实例化控件时,请确保调用 LoadControl 以便正确添加对象:
dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
您必须在 Page_PreInit 事件处理程序中创建您的控件。ASP.NET 服务器控制模型很棘手;您必须完全了解页面生命周期才能正确执行此操作。
正如其他人所说,任何形式的控制操作都必须在创建视图状态之前完成。
这是页面生命周期的一个很好的链接,可以帮助您:
我们经历过同样的事情,并通过在 page_load 上使用具有完全相同 .ID 的幽灵控件来处理它,然后回发获取事件和数据。正如其他人所说,在初始化阶段之后动态添加控件,状态已经构建,之后添加的控件没有存储。
希望这个对你有帮助。
我还想补充一点,我已经看到用户控件的工作方式与您期望的一样,只需在运行时设置 Control.ID 属性即可。如果您不设置 ID,项目可能会以不同的顺序构建并且工作异常。