ASP.Net:动态添加到占位符的用户控件无法检索值
我正在向PlaceHolder服务器控件动态添加一些用户控件。我的用户控件由一些标签和一些文本框控件组成。
当我提交表单并尝试查看服务器上的文本框(在每个用户控件内)的内容时,它们为空。
回发完成后,文本框将包含我在回发之前输入的数据。这告诉我框中的文本是通过ViewState保留的。我只是不知道为什么在调试时找不到它们。
有人可以告诉我为什么我看不到用户在服务器上输入的数据吗?
谢谢你的帮助。
解决方案
我相信我们需要在页面生命周期的Init阶段将UserControl添加到PlaceHolder,以便使ViewState可以由Load阶段填充以读取这些值。这是我们加载这些物品的顺序吗?
我们必须在Page_PreInit事件处理程序中创建控件。 ASP.NET服务器控制模型很棘手。我们必须完全了解页面生命周期才能正确执行。
正如其他人所说,在创建viewstate之前必须完成任何形式的控件操纵。
这是页面生命周期上的一个好链接,可以为我们提供帮助:
http://msdn.microsoft.com/en-us/library/ms178472.aspx
这是基于.NET v1事件序列的,但应该可以使我们想到:
- 初始化(初始化事件)
- 加载回发数据(如果回发)
- 引发回发事件(如果回发)
- PreRender(PreRender事件)
- 保存视图状态
- 使成为
- 卸载(卸载事件)
- 处置
如我们所见,将ViewState数据加载回控件的操作发生在Load事件之前。因此,为了使我们动态添加的控件"保留"这些值,必须存在它们才能使ASP.NET页重新加载这些值。我们必须在"加载视图状态"发生之前的Init阶段重新创建这些控件。
确保在类级别定义动态控件并将其添加到ASP容器中:
Private dynControl As ASP.MyNamespace_MyControl_ascx
并且在实例化控件时,请确保调用LoadControl,以便正确添加对象:
dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
我们经历过同样的事情,并通过在page_load上使用具有完全相同的.ID的幻影控件来处理它,然后回发以拾取事件和数据。就像其他人所说的那样,在初始阶段之后,已经动态建立了控件,状态已经被建立,并且之后添加的控件没有被存储。
希望这个对你有帮助。
我还想补充一点,我看到用户控件的工作方式与我们期望的一样,只需在运行时设置Control.ID属性即可。如果我们未设置ID,则项目的生成顺序可能会不同,并且工作异常。
昨天我发现,实际上可以通过在触发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