2012-09-18 98 views
0

我有一个从表中填充的文件夹/链接的树形结构类型结构。我试图做的是程序循环通过我的记录集,并在page_init中生成我的html,然后尝试绑定控件。当我尝试将链接按钮添加到HTML中的占位符时,它似乎永远找不到它们。动态生成html/asp

我可能会缺少一些基本的东西,我见过的所有例子都绑定了页面上已有的控件,我无法在page_init中自己生成html吗?

例如

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
    content_div.Innerhtml = "<asp:PlaceHolder id=""test"" runat=""server"" ></asp:PlaceHolder>" 
End Sub 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim _linkb As New LinkButton 
    _linkb.ID = "lb_cat_" & cat.uID 
    _linkb.Attributes.Add("href", "javascript: sltoggle('cat_" & cat.uID & "');") 
    _linkb.Attributes.Add("Text", "Expand/Close") 
    _linkb.Attributes.Add("runat", "server") 
    Dim ph As PlaceHolder = DirectCast(TRIEDEVERYTHINGUNDERTHESUN.FindControl("test"), PlaceHolder) 
    ph.Controls.Add(_linkb) 
End Sub 

如果有人可以点我在正确的方向它会非常感激

问候, 皮特

更新 - 全码

Private Sub load_dynamic_file_view() 
    Dim _sb As New StringBuilder 
    Dim _sfc As New sf_file_category, _sff As New sf_file 
    _lsfc = _sfc.get_all_sf_file_category 
    _lsff = _sff.get_active_sf_files 

    Dim _list_root As List(Of sf_file_category) = _lsfc.FindAll(Function(p) p.parent_id = 0) 
    If Not _list_root Is Nothing Then 
     _sb.Append("<strong>File Downloads</strong><br />") 
     _sb.Append("<div class=""indent-me"" ><br />") 
     For Each cat As sf_file_category In _list_root 
      'header/Open Link 
      Dim _linkb As New LinkButton 
      _linkb.ID = "lb_cat_" & cat.uID 
      _linkb.Attributes.Add("href", "javascript: sltoggle('cat_" & cat.uID & "');") 
      _linkb.Attributes.Add("Text", "Expand/Close") 
      _linkb.Attributes.Add("runat", "server") 
      Dim ph As PlaceHolder = DirectCast(Me.Master.FindControl("lb_cat_" & cat.uID), PlaceHolder) 
      ph.Controls.Add(_linkb) 

      _sb.Append(HtmlDecode(cat.name) & " &nbsp;&nbsp;&nbsp;<Asp:PlaceHolder id=""lb_cat_" & cat.uID & """ runat=""server"" /><br />") 
      '_sb.Append("<div id=""cat_" & cat.uID & """ class=""toggle-hide"">") 
      '_sb.Append(add_child_folder(cat.uID, content)) 
      '_sb.Append(show_files(cat.uID, content)) 
      '_sb.Append("</div><div class=""clearfix"" />") 
     Next 
     _sb.Append("</div>") 
     _sb.Append("<br /><br />") 
    End If 

    content_div.InnerHtml = _sb.ToString 
End Sub 

Private Function add_child_folder(ByVal catid As Long, ByRef content As ContentPlaceHolder) As String 
    Dim _sb As New StringBuilder 
    Dim _cl As List(Of sf_file_category) = _lsfc.FindAll(Function(p) p.parent_id = catid) 
    If Not _cl Is Nothing Then 
     _sb.Append("<div class=""indent-me"" ><br />") 
     'For Each _c As sf_file_category In _cl.OrderBy(Function(p) p.view_order) 

     _cl.Sort(Function(c1 As sf_file_category, c2 As sf_file_category) 
        Return c1.view_order.CompareTo(c2.view_order) 
       End Function) 

     For Each cat As sf_file_category In _cl 
      Dim _linkb As New LinkButton 
      _linkb.ID = "lb_cat_" & cat.uID 
      _linkb.Attributes.Add("href", "javascript: sltoggle(&#39;cat_" & cat.uID & "&#39;);") 
      _linkb.Attributes.Add("Text", "Expand/Close") 
      _linkb.Attributes.Add("runat", "server") 
      Content.Controls.Add(_linkb) 

      _sb.Append(HtmlDecode(cat.name) & "&nbsp;&nbsp;&nbsp;<Asp:LinkButton id=""lb_cat_" & cat.uID & """ runat=""server"" Text=""Expand/Close"" href=&#39;javascript: sltoggle(&#39;cat_" & cat.uID & "&#39;);&#39; /><br />") 
      '_sb.Append("<div id=""cat_" & cat.uID & """ class=""toggle-hide"">") 
      _sb.Append(add_child_folder(cat.uID, content)) 
      _sb.Append(show_files(cat.uID, content)) 
      '_sb.Append("</div><div class=""clearfix"" >") 
     Next 
     _sb.Append("</div><br />") 
    End If 

    Return _sb.ToString 
End Function 

Private Function show_files(ByVal catid As Long, ByRef content As ContentPlaceHolder) As String 
    Dim _sb As New StringBuilder 
    Dim _fl As List(Of sf_file) = _lsff.FindAll(Function(p) p.file_category = catid) 
    If Not _fl Is Nothing Then 
     _sb.Append("<div class=""indent-me"" ><br />") 
     For Each _f As sf_file In _fl 
      Dim _linkb As New LinkButton 

      _linkb.ID = "file_" & _f.uID 
      _linkb.Attributes.Add("onCommand", "download_file") 
      _linkb.Attributes.Add("CommandArgument", _f.uID.ToString) 
      _linkb.Attributes.Add("Text", _f.file_name) 
      _linkb.Attributes.Add("runat", "server") 
      AddHandler _linkb.Command, AddressOf download_file 
      content.Controls.Add(_linkb) 

      _sb.Append("<asp:LinkButton id=""file_" & _f.uID & """ runat=""server"" onCommand=""download_file"" commandArgument=""" & _f.uID & """ Text=""" & _f.file_name & """ /><br />") 
     Next 
     _sb.Append("</div><br />") 
    End If 
    Return _sb.ToString 
End Function 

回答

0

您的完整代码显示的是您构建了大量的HTML。这对一些较小的情况很好,但是现在你的代码显然变得相当大了,我建议你改变这种方法。

我会建议你声明的网络控制现金等价物,如:

new HtmlGenericControl("div") instead of <div></div> 

OR

new HtmlAnchor() OR new LinkButton() instead of <a></a> 

在树形结构的例子中,HTML可能看起来像这样:

<ul> 
    <li> 
     <a href="root.htm">ROOT</a> 
     <ul> 
      <li> 
       <a href="levelone">LEVEL 1</a> 
      </li> 
     </ul> 
    </li> 
</ul> 

要在代码中生成此代码,请执行以下操作:

'Menu Holder 
Dim treeStruct As HtmlGenericControl("ul") 

'Root 
Dim branch As HtmlGenericControl("li") 
Dim branchItem as HtmlAnchor("a") 

'Level 1 
Dim subLevel As HtmlGenericControl("ul") 
Dim subBranch As HtmlGenericControl("li") 
Dim subBranchItem as HtmlAnchor("a") 

'Setup Level 1 
subBranchItem.InnerText = "LEVEL 1" 
subBranchItem.Href = "levelone" 

subBranch.Controls.Add(subBranchItem) 
subLevel.Controls.Add(subBranch) 

'Setup Root 
branchItem.InnerText = "ROOT" 
branchItem.Href = "root.htm" 

'Add Link To Root 
branch.Controls.Add(branchItem) 
'Add Sub Branch To Root 
branch.Controls.Add(subLevel) 

treeStruct.Controls.Add(branch) 

重要上面的代码只是为了例子起见,最好你会的功能回路通过与您的for循环的元素分成功能分支的创建,然后。

您还会注意到我已经使用了<UL>代替<DIV>,我会考虑一个树状结构是未排序的列表。另外,您还可以从这个更加隆起的结构中获得造型优势。

我希望这有助于

+0

感谢你们,下班后我不得不仔细看看它,看看我可以上班:) –

+0

嗨,我得到了这个例子工作正常。我无法完全自定义我的老板想要的东西,所以我不得不尝试调整它/尝试别的东西,但我标记为答案,以便其他人可以使用。再次感谢。 –

+0

当您需要动态生成如此多的HTML时,这是恢复结构的好方法。您可以将任何类型的控件放入'.Control.Add()'函数中,这样您就可以始终使用'LiteralControl'为您提供更多定制。 – JDandChips

0

它看起来像你试图添加一个占位符到01但是,您正在做的是将标记呈现为HTML内容。

我不知道到底是什么类型的控制content_div的是,但你不能尝试:

​​

这将然后让你找到content_div控制范围内的控制。

然而,什么可能会是一个更简洁的解决方案,你可能是以下几点:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim _linkb As New LinkButton 
    _linkb.ID = "lb_cat_" & cat.uID 
    _linkb.Attributes.Add("href", "javascript: sltoggle('cat_" & cat.uID & "');") 
    _linkb.Attributes.Add("Text", "Expand/Close") 
    //you don't need this when using code behind 
    //_linkb.Attributes.Add("runat", "server") 

    //this will add your linkbutton to the content_div control 
    content_div.Controls.Add(_linkb) 
End Sub 

给这个前,你应该发现它是用动态构建你的页面的有效途径asp控件。

+0

我将我的HTML到一个div标签通过对page_init innerHTML属性。所以占位符标签应该在page_load的div中,这是正确的吗? –

+0

InnerHtml是一个字符串,它只会呈现为HTML。如果你想添加一个控件,你以后可以用FindControl找到,那么你需要将控件添加到页面中,通常在另一个控件或页面本身中。在我的例子中,这样做的一种方法是,你尝试过吗? – JDandChips

+0

只是现在就去 - 我会回到你身边:) –

0

您只生成HTML标记,不生成ASP.Net标记,因为它们不能被浏览器解析。

我觉得你的代码应该像

content_div.Innerhtml = "<div id='test'></div>" 

ASP:占位符控件只是一个占位符,它不等于div的HTML标签。 举个例子,我在这里给了div标签。

0

作为文本添加的asp.net控件不为页面所知,因此没有为它存储视图状态/对象,因此您无法使用Findcontrol找到它。

使用控件的对象并将其添加到父控件的控件集合 (例如,

div.Controls.Add(new PlaceHolder() { ... }); 

在Render事件之前添加它之后,它的状态将被保存并可访问。