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
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

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 21:08
fuente por usuario

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 21:04
fuente por usuario

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 20:37
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more