我在GridView
中有以下列,我的问题是它只呈现文本“下载”,而不是URL。
<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}" />
当我将一行DataTable
绑定到网格时,该行中的ArchiveLocation
包含值:
“?〜/普通/表格/ ExportStream.aspx路径= C:\发展\大通\进出口\ ChaseExport-090312073930.zip”。
答案 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以确保它是您所期望的。
超链接字段是否在行模板中,而不是页眉或页脚?