Aquí podría ser tu PUBLICIDAD


HyperLinkField no se muestra como enlace

votos
0

Tengo la siguiente columna en a GridView, y mi problema es que solo muestra el texto Descargar, no una URL.

<asp:HyperLinkField DataNavigateUrlFields=ArchiveLocation Text=Download DataNavigateUrlFormatString={0} />

Cuando enlace un DataTablecon una fila a la grilla, el ArchiveLocationen esa fila contiene el valor:

~ / Common / Forms / ExportStream.aspx? Path = C: \ Development \ Chase \ Exports \ ChaseExport-090312073930.zip.

Publicado el 12/03/2009 a las 20:19
fuente por usuario ProfK
En otros idiomas...        العربية       

4 respuestas

votos
2

Una solución alternativa sería usar un campo de plantilla y codificar los dos puntos a su representación hexadecimal, que sería% 3A.

<asp:TemplateField>
    <ItemTemplate>
        <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("ArchiveLocation","{0}").Replace(":", Server.UrlEncode(":")) %>' Text="Download"></asp:HyperLink>
    </ItemTemplate>
</asp:TemplateField>

Al recuperar el valor de la colección de variables de cadena de consulta, se decodificará automáticamente.

string path = Request.QueryString["path"];
Respondida el 13/03/2009 a las 05:53
fuente por usuario Phaedrus


Aquí podría ser tu PUBLICIDAD


votos
1

Use NavigateUrl solo si desea la misma URL para todos los registros.

Parece que HyperLinkField representa texto solo si hay dos puntos en el valor del campo. Elimina los dos puntos y verás hipervínculos. No sé por qué todavía.

Aparentemente, el método OnDataBindField llama a CrossSiteScriptingValidation.IsDangerousUrl que considera ':' peligroso en su nombre:

internal static bool IsDangerousUrl(string s)
{
    if (string.IsNullOrEmpty(s))
    {
        return false;
    }
    s = s.Trim();
    int length = s.Length;
    if (((((length > 4) && ((s[0] == 'h') || (s[0] == 'H'))) && ((s[1] == 't') || (s[1] == 'T'))) && (((s[2] == 't') || (s[2] == 'T')) && ((s[3] == 'p') || (s[3] == 'P')))) && ((s[4] == ':') || (((length > 5) && ((s[4] == 's') || (s[4] == 'S'))) && (s[5] == ':'))))
    {
        return false;
    }
    if (s.IndexOf(':') == -1)
    {
        return false;
    }
    return true;
}
Respondida el 12/03/2009 a las 09:08
fuente por usuario Ruslan

votos
0

Quisiera depurar el proceso de enlace de datos agregando el controlador de eventos onitemdatabound, estableciendo un punto de interrupción en él y luego mirando su DataItem para asegurarme de que es lo que está esperando.

El campo de hipervínculo está en una plantilla de fila y no en un encabezado o pie de página, ¿no?

Respondida el 12/03/2009 a las 09:04
fuente por usuario Jeff Martin

votos
0

Tienes que decirle a qué vincular cuando utilizas una plantilla. Campo

<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}"  NavigateUrl='<%#Eval("ArchiveLocation")%>' />
Respondida el 12/03/2009 a las 08:37
fuente por usuario Glennular