【问题标题】:ASP.Net: User controls added to placeholder dynamically cannot retrieve valuesASP.Net:动态添加到占位符的用户控件无法检索值
【发布时间】:2010-09-11 06:37:51
【问题描述】:

我正在向 PlaceHolder 服务器控件动态添加一些用户控件。我的用户控件由一些标签和一些文本框控件组成。

当我提交表单并尝试查看服务器上文本框(每个用户控件内)的内容时,它们是空的。

回发完成后,文本框会包含我在回发之前输入的数据。这告诉我,框中的文本正在通过 ViewState 保留。我只是不知道为什么我在调试时找不到它们。

谁能告诉我为什么我看不到用户在服务器上输入的数据?

感谢您的帮助。

【问题讨论】:

    标签: asp.net postback user-controls


    【解决方案1】:

    我昨天发现,您实际上可以通过在 loadviewstateevent 触发后立即加载控件树来使您的应用程序正常工作。如果您覆盖 loadviewstate 事件,调用 mybase.loadviewstate,然后在其后放置您自己的代码来重新生成控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用视图状态字段来保存可用于重新创建这些控件的 ID 或数组信息。

    Protected Overrides Sub LoadViewState(ByVal savedState As Object)
        MyBase.LoadViewState(savedState)
        If IsPostBack Then
            CreateMyControls()
        End If
    End Sub
    

    【讨论】:

    • 不错 - 我们创建控件 /after/ ViewState 加载似乎违反直觉 - 但它工作得很好。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我们经历过同样的事情,并通过在 page_load 上使用具有完全相同 .ID 的幽灵控件来处理它,然后回发获取事件和数据。正如其他人所说,它是在初始化阶段之后动态添加控件,状态已经构建并且之后添加的控件没有存储。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        确保您在类级别定义动态控件并将它们添加到 ASP 容器中:

        Private dynControl As ASP.MyNamespace_MyControl_ascx
        

        当您实例化控件时,请确保调用 LoadControl 以便正确添加对象:

        dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
        

        【讨论】:

          【解决方案5】:

          这是基于 .NET v1 事件序列,但它应该给你的想法:

          • 初始化(初始化事件)
          • 开始跟踪视图状态(检查是否回发)
            • 加载视图状态(如果回发)
            • 加载回发数据(如果回发)
          • 加载(加载事件)
            • 引发更改的事件(如果回发)
            • 引发回发事件(如果回发)
          • PreRender(PreRender 事件)
          • 保存视图状态
          • 渲染
          • 卸载(卸载事件)
          • 处理

          如您所见,将 ViewState 数据加载回控件发生在 Load 事件之前。因此,为了让您动态添加的控件“保留”这些值,它们必须存在,以便 ASP.NET 页面首先重新加载这些值。在加载视图状态发生之前,您必须在 Init 阶段重新创建这些控件。

          【讨论】:

          • 我发现必须使用相同的 ID 重新创建控件。在某些情况下,它似乎不一样......所以我在作弊并对其进行硬编码,这有效但非常不雅。
          【解决方案6】:

          正如其他人所说,任何形式的控件操作都必须在创建视图状态之前完成。

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

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

          【讨论】:

            【解决方案7】:

            您必须在 Page_PreInit 事件处理程序中创建您的控件。 ASP.NET 服务器控制模型很棘手;您必须完全了解page lifecycle 才能正确操作。

            【讨论】:

              【解决方案8】:

              我相信您需要在页面生命周期的 Init 阶段将 UserControl 添加到 PlaceHolder,以便在 Load 阶段填充 ViewState 以读取这些值。这是您加载这些的顺序吗?

              【讨论】:

                猜你喜欢
                • 2013-06-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-02-08
                相关资源
                最近更新 更多