ASP.Net:用户控制中加入符动态不能检索的数值
-
01-07-2019 - |
题
我加入了一些用户控制动态,以一种符服务器的控制。我的用户控制包括一些片公司的财产和一些文本的控制。
当我提交形式,并试图查看的内容的文本框(每一个内的用户控制)在服务器上,它们都是空的。
当回发完成,该文本框有数据,我进入了之前回发。这告诉我,该案文的框在保留通过视图状态中。我只是不知道为什么我不能找到他们时我很调试。
有人可以告诉我为什么我不能见到的数据用户输入服务器上?
谢谢你任何帮助。
解决方案
这是基础上的。净v1事件的顺序,但它应该给你这个想法:
- 初始化(Init事件)
- 开始跟踪视状态(检查,如果回发)
- 负视状态(如果回发)
- 载回发数据(如果回发)
- 负载(载的事件)
- 提高改变了事件(如果回发)
- 提高回发事件(如果回发)
- 预呈现(预呈现的事件)
- 保存视状态
- 呈现
- 卸货(卸载活动)
- 处置
正如你可以看到,载的视图状态的数据回到控制,发生前所载的事件。因此,为了对你的动态加控制的"保留"这些价值观,他们必须 本 的ASP.NET 网页重新加载的价值放在第一位。你将不得不重新建立这些管制在初始阶段之前,载景的状态发生。
其他提示
我昨天想通过在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
我相信您需要在页面生命周期的Init阶段将UserControl添加到PlaceHolder,以便在Load阶段填充ViewState以读取这些值。这是你加载它们的顺序吗?
确保您在类级别定义动态控件并将它们添加到ASP容器中:
Private dynControl As ASP.MyNamespace_MyControl_ascx
当您实例化控件时,请确保调用LoadControl以正确添加对象:
dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
您必须在Page_PreInit事件处理程序中创建控件。 ASP.NET服务器控件模型很棘手;您必须完全理解页面生命周期才能正确完成。
正如其他人所说,任何形式的控制操作都必须在创建viewstate之前完成。
以下是页面生命周期中的一个很好的链接,可以帮助您:
我们遇到了同样的事情,并通过使用具有完全相同.ID的page_load上的ghost控件来处理它,然后回发文件拾取事件和数据。正如其他人所说的那样,在init阶段之后动态添加控件已经建立了状态,并且没有存储后添加的控件。
希望这有点帮助。
我还想补充说,我已经看到用户控件的工作方式与您期望的一样,只需在运行时设置Control.ID属性即可。如果您没有设置ID,则可能会以不同的顺序构建项目并且工作很奇怪。