【问题标题】:Find controls on sharepoint master page在 sharepoint 母版页上查找控件
【发布时间】:2008-09-30 16:16:06
【问题描述】:

我正在尝试遍历共享点页面上的所有控件,出于测试目的,我只想输出控件 ID

这是我正在使用的代码

Public Shared Sub SubstituteValues3(ByVal CurrentPage As Page, ByRef s As StringBuilder)

    'Page()
    '- MasterPage
    '- HtmlForm
    '- ContentPlaceHolder
    '- The TextBoxes, etc.

    For Each ctlMaster As Control In CurrentPage.Controls


        If TypeOf ctlMaster Is MasterPage Then
            HttpContext.Current.Response.Output.Write("Master Page <br/>")

            For Each ctlForm As Control In ctlMaster.Controls

                If TypeOf ctlForm Is HtmlForm Then
                    HttpContext.Current.Response.Output.Write("HTML Form <br/>")

                    For Each ctlContent As Control In ctlForm.Controls
                        If TypeOf ctlContent Is ContentPlaceHolder Then
                            HttpContext.Current.Response.Output.Write("Content Placeholder <br/>")

                            For Each ctlChild As Control In ctlContent.Controls
                                HttpContext.Current.Response.Output.Write(ctlChild.ID.ToString & "<br />")
                            Next
                        End If
                    Next
                End If
            Next
        End If
    Next

    HttpContext.Current.Response.Output.Write("--------------")
    HttpContext.Current.Response.End()

但是它没有通过“MasterPage”输出。

我希望在内容占位符中看到所有控件的名称,但我觉得这有点令人困惑。

【问题讨论】:

  • 澄清一下,这是从 WebPart 还是从 SharePoint 母版页中完成的?
  • 如何调用 SubstituteValues3?您为 CurrentPage 参数赋予什么值?如答案中所述,您的代码可能永远无法正常工作,因为母版页不是该页面的子控件。

标签: asp.net sharepoint master-pages


【解决方案1】:

从 Page.Master.Controls 开始

从那里你应该基本上可以工作

        For Each ctlForm As Control In Page.Master.Controls

            If TypeOf ctlForm Is HtmlForm Then
                HttpContext.Current.Response.Output.Write("HTML Form <br/>")

                For Each ctlContent As Control In ctlForm.Controls
                    If TypeOf ctlContent Is ContentPlaceHolder Then
                        HttpContext.Current.Response.Output.Write("Content Placeholder <br/>")

                        For Each ctlChild As Control In ctlContent.Controls
                            HttpContext.Current.Response.Output.Write(ctlChild.ID.ToString & "<br />")
                        Next
                    End If
                Next
            End If
        Next

【讨论】:

    【解决方案2】:

    MasterPage 不是当前页面的控件,它是当前页面的属性,在 Page.MasterPage

    【讨论】:

      【解决方案3】:

      我发现这段代码似乎列出了我需要的控件,但我认为这更像是一种 hack。

      For i = 0 To CurrentPage.Request.Form.AllKeys.Length - 1
              If CurrentPage.Request.Form.GetKey(i).Contains("ctl00$PlaceHolderMain$") Then
      
      
                  Dim key As String = CurrentPage.Request.Form.GetKey(i).Substring(22)
                  Dim keyText As String = String.Format("[{0}]", key)
      
                  HttpContext.Current.Response.Output.Write(keyText & "<br/>")
      
                  'Text.Replace(keyText, CurrentPage.Request.Form("ctl00$PlaceHolderMain$" & key))
              End If
          Next
      

      【讨论】:

        【解决方案4】:

        您可以简单地使用递归来做到这一点,虽然效率不高,但它很简单......试试这个方法: public void getControls(控制输入)

        {
            foreach (Control c in input.Controls)
            {
                Response.Write(c.GetType().ToString() + " - " + c.ID + "<br />");
                getControls(c);
            }
        }
        

        然后这样称呼它:

        getControls(Page);
        

        这将循环遍历您页面上的所有控件并输出它们的 type - ID 并将其打印到页面顶部...您也可以使用代码构建一个列表或者你想做的任何事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          相关资源
          最近更新 更多