Programowe dodanie hiperłącza do listy punktowanej, która NIE JEST DisplayMode = Hiperłącze
Mam kontrolkę listy punktowanej ASP.NET, która do dziś została utworzona i używana tylko dla zwykłego tekstu. Nowa prośba o projekt prosi, aby zamienić SOME tych elementów w hiperłącza. Dlatego lista wypunktowana będzie musiała zawierać kilka zwykłych elementów tekstowych i niektóre hiperłącza. Jeśli zmienię go na DisplayMode = Hiperłącze, nawet jeśli zostawię wartość pustą, wpisy, które powinny być zwykłym tekstem, nadal będą linkami klikalnymi.
Jednym z rozwiązań, które myślę, że mogę wykonać, jest użycie kontroli literalnej i użycie HTML (<a href...
) na liniach, które muszą być linkami. To pociągnie za sobą trochę przepracowania starego kodu, więc zanim spróbuję, naprawdę chcę wiedzieć, czy jest to możliwe z istniejącą listą BulletedList.
EDYTOWAĆ:
Nigdzie nie mogłem znaleźć niczego na ten temat i generalnie uważam się za całkiem dobrego Googlera. Tak więc dla jednej lub dwóch zagubionych i zdezorientowanych dusz, które znajdują się w tym samym scenariuszu w następnej dekadzie, oto moja pełna realizacja doskonałej odpowiedzi przedstawionej poniżej:
W kodowaniu strony:
foreach (SupportLog x in ordered)
{
blschedule.Items.Add(new ListItem(x.Headline, "http://mysite/Support/editsupportlog.aspx?SupportLogID=" + x.SupportLogID));
}
blschedule.DataBind();
Zwróć uwagę na DataBind na końcu --- jest to konieczne, aby wpaść w zdarzenie 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);
}
}
}
W nagłówku strony .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>
Instrukcja if jest wymagana, aby upewnić się, że tylko elementy, które mają atrybut „data-url”, są przekształcane w łącza, a nie zamieniają WSZYSTKIE elementy w łącza.