我正在向PlaceHolder服务器控件动态添加一些用户控件。我的用户控件包含一些标签和一些文本框控件。
当我提交表单并尝试查看服务器上文本框(在每个用户控件中)的内容时,它们都是空的。
当回发完成时,文本框具有我在回发之前输入的数据。这告诉我框中的文本是通过ViewState保留的。我只是不知道为什么我在调试时找不到它们。
有人可以告诉我为什么我不会看到用户在服务器上输入的数据?
感谢您的帮助。
答案 0 :(得分:9)
这是基于.NET v1事件序列,但它应该给你一个想法:
如您所见,将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之前完成。
以下是页面生命周期中的一个很好的链接,可以帮助您:
答案 6 :(得分:0)
我们遇到了同样的事情,并通过使用具有完全相同.ID的page_load上的ghost控件来处理它,然后回发文件拾取事件和数据。正如其他人所说的那样,在init阶段之后动态添加控件已经建立了状态,并且没有存储后添加的控件。
希望这有点帮助。
答案 7 :(得分:0)
我还想补充说,我已经看到用户控件的工作方式与您期望的一样,只需在运行时设置Control.ID属性即可。如果您没有设置ID,则可能会以不同的顺序构建项目并且工作很奇怪。