以编程方式添加一个超链接,是不是DISPLAYMODE =超链接的项目符号列表(Programmat

2019-08-01 22:52发布

我有,直到今天,创建并只对纯文本使用ASP.NET项目符号列表控制。 新的设计要求问,我把部分这些项目为超链接。 因此,项目符号列表将最终需要包含一些纯文本的项目,以及一些超链接。 如果我将其更改为DISPLAYMODE =超链接,即使我离开值为空,该条目应该只是纯文本仍然成为可点击的链接。

一个解决方案,我认为我可以做的工作,就是用文字控制和使用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语句是必需的,以确保只把有“数据链接”属性为链接的项目,而不是把所有物品进入链接。

Answer 1:

您可能会发现它更容易使用<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,但它应该是接近



文章来源: Programmatically adding a hyperlink to a bulleted list that IS NOT DisplayMode=Hyperlink