HyperLinkField未显示为链接

时间:2009-03-12 19:19:31

标签: asp.net

我在GridView中有以下列,我的问题是它只呈现文本“下载”,而不是URL。

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

当我将一行DataTable绑定到网格时,该行中的ArchiveLocation包含值:

  

“?〜/普通/表格/ ExportStream.aspx路径= C:\发展\大通\进出口\ ChaseExport-090312073930.zip”。

4 个答案:

答案 0 :(得分:2)

解决方法是使用模板字段并将冒号编码为十六进制表示形式,即%3A。

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

从查询字符串变量集合中检索值时,它将自动解码。

string path = Request.QueryString["path"];

答案 1 :(得分:1)

仅当您希望所有记录都使用相同的URL时才使用NavigateUrl。

只有在字段值中有冒号时,HyperLinkField才会呈现文本。删除冒号,你会看到超链接。我不知道为什么。

显然,OnDataBindField方法调用CrossSiteScriptingValidation.IsDangerousUrl,代表您认为':'是危险的:

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

答案 2 :(得分:0)

使用templateField

时,必须告诉它要绑定的内容
<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}"  NavigateUrl='<%#Eval("ArchiveLocation")%>' />

答案 3 :(得分:0)

我会通过添加onitemdatabound事件处理程序来调试数据绑定过程,在其中设置断点,然后查看您的DataItem以确保它是您所期望的。

超链接字段是否在行模板中,而不是页眉或页脚?