2012-10-26 81 views
3

我有一個ASP.NET項目符號列表控件,直到今天,只有純文本創建和使用。一項新的設計要求要求我將這些項目中的一部分變成超鏈接。因此,項目符號列表最終需要包含一些純文本項目和一些超鏈接。如果我將它更改爲DisplayMode = Hyperlink,即使我將值留空,那麼應該只是純文本的條目仍然會變成可點擊的鏈接。編程添加一個超鏈接到不是顯示模式=超鏈接

我認爲我可以做的一個解決方案是使用Literal控件,並在需要鏈接的行上使用HTML(<a href...)。這將需要一些舊代碼的重新工作,所以在我嘗試之前我真的想知道這是否可以用現有的BulletedList。


編輯:

我認真找不到這事,任何地方,我一般認爲自己是一個相當不錯的Google員工。所以對於一個或兩個失落和迷惘的靈魂誰發現自己在某個時候,在未來十年同樣的場景,這裏是下面提供我的出色答卷的完整實現:​​

在頁面的後臺代碼:

foreach (SupportLog x in ordered) 
{ 
    blschedule.Items.Add(new ListItem(x.Headline, "http://mysite/Support/editsupportlog.aspx?SupportLogID=" + x.SupportLogID)); 
} 

blschedule.DataBind(); 

注意在末尾的DataBind ---這是必要陷入DataBound事件:

protected void blschedule_DataBound(object sender, EventArgs e) 
{ 
    foreach (ListItem x in blschedule.Items) 
    { 
     if (x.Value.Contains("http")) //an item that should be a link is gonna have http in it, so check for that 
     { 
      x.Attributes.Add("data-url", x.Value); 
     } 
    } 
} 

在.aspx頁面的頭:

<script src="<%# ResolveClientUrl("~/jquery/jquery141.js") %>" type="text/javascript"></script> 
    <script> 

     $(document).ready(function() { 

      $('#<%=blschedule.ClientID %> li').each(function() { 
       var $this = $(this); 
       var attr = $this.attr('data-url'); 

       if (typeof attr !== 'undefined' && attr !== false) { 
        $this.html('<a href="' + $this.attr('data-url') + '">' + $this.text() + '</a>'); 
       } 
      }); 
     }); 

    </script> 

要求if語句確保只將具有「data-url」屬性的項目變爲鏈接,而不是將所有項目變爲鏈接。

回答

2

您可能會發現爲該任務使用<asp:Repeater />更容易。

喜歡的東西:

<asp:Repeater ID="Repeater1" runat="server"> 
    <HeaderTemplate><ul></HeaderTemplate> 
    <ItemTemplate> 
     <li><%# string.IsNullOrEmpty(Eval("url").ToString()) ? Eval("text") : string.Format("<a href=\"{0}\">{1}</a>", Eval("url").ToString(), Eval("text").ToString()) %></li> 
    </ItemTemplate> 
    <FooterTemplate></ul></FooterTemplate> 
</asp:Repeater> 

Hackalicious路

的URL值設置爲DataValueField當數據綁定BulletedList

使用DataBound事件通過項目迭代和添加屬性給每個人一個URL值

protected void BulletedList1_DataBound(object sender, EventArgs e) 
{ 
    foreach (ListItem i in BulletedList1.Items) 
    { 
     if (i.Value.Length > 0) 
     { 
      i.Attributes.Add("data-url", i.Value); 
     } 
    } 
} 

使用的JavaScript/jQuery來施加必要的標記:

$('[data-url]').each(function() { 
    var $this = $(this); 
    $this.html('<a href="' + $this.attr('data-url') + '">' + $this.text() + '</a>'); 
}); 

沒有測試這個jQuery,但它應該是接近

+0

謝謝。是的,我最後的手段是將其更改爲另一個控制器,如直放站或文字。我正在尋找一種解決方案,可以讓我保留BulletedList,因爲有很多引用BulletedList的代碼。 – CptSupermrkt

+0

用「hackiness」方式更新:) – MikeM

+0

非常感謝!我能夠使用你的想法並實施一個工作解決方案。我編輯了我的原始問題與詳細的實施。再次感謝。 – CptSupermrkt