Programaticamente adicionando um hiperlink a uma lista com marcadores que não é DisplayMode = Hyperlink
Eu tenho um controle de lista com marcas do asp.net que, até hoje, foi criado e usado apenas para texto sem formatação. Uma nova solicitação de design pede que eu ligue alguns desses itens em hiperlinks. Portanto, a lista com marcadores precisará conter alguns itens de texto simples e alguns hiperlinks. Se eu alterá-lo para DisplayMode = Hyperlink, mesmo se eu deixar o valor em branco, as entradas que devem ser apenas texto simples ainda se tornarão links clicáveis.
Uma solução que eu acho que posso fazer funcionar, é usar um controle Literal e usar HTML (<a href...
) nas linhas que precisam ser links. Isso implicará um pouco de re-trabalho algum código antigo, então antes de eu tentar que eu realmente quero saber se isso é possível fazer com o BulletedList existente.
EDITAR:
Eu realmente não consegui encontrar nada sobre isso em nenhum lugar, e geralmente me considero um bom Googler. Então, para uma ou duas almas perdidas e confusas que se encontram no mesmo cenário em algum momento na próxima década, aqui está minha implementação completa da excelente resposta oferecida abaixo:
No code-behind da página:
foreach (SupportLog x in ordered)
{
blschedule.Items.Add(new ListItem(x.Headline, "http://mysite/Support/editsupportlog.aspx?SupportLogID=" + x.SupportLogID));
}
blschedule.DataBind();
Observe o DataBind no final --- isso é necessário para cair no evento 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);
}
}
}
Na cabeça da página .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>
A instrução if é necessária para garantir que apenas os itens com o atributo "data-url" sejam transformados em links e não transformar TODOS os itens em links.