我加入了一些用户控制动态,以一种符服务器的控制。我的用户控制包括一些片公司的财产和一些文本的控制。

当我提交形式,并试图查看的内容的文本框(每一个内的用户控制)在服务器上,它们都是空的。

当回发完成,该文本框有数据,我进入了之前回发。这告诉我,该案文的框在保留通过视图状态中。我只是不知道为什么我不能找到他们时我很调试。

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

谢谢你任何帮助。

有帮助吗?

解决方案

这是基础上的。净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之前完成。

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

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

我们遇到了同样的事情,并通过使用具有完全相同.ID的page_load上的ghost控件来处理它,然后回发文件拾取事件和数据。正如其他人所说的那样,在init阶段之后动态添加控件已经建立了状态,并且没有存储后添加的控件。

希望这有点帮助。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top