English 中文(简体)
超链接字段未显示为链接
原标题:
  • 时间:2009-03-12 19:19:31
  •  标签:

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

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

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

"~/Common/Forms/ExportStream.aspx?path=C:DevelopmentChaseExportsChaseExport-090312073930.zip" 的中文翻译为:“~/Common/Forms/ExportStream.aspx?路径=C:DevelopmentChaseExportsChaseExport-090312073930.zip”。

最佳回答

只有在所有记录都需要相同的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;
}
问题回答

一个解决方法是使用模板字段并将冒号编码为其十六进制表示形式,即%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"];

在使用模板字段时,您必须告诉它绑定到哪里。

<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}"  NavigateUrl= <%#Eval("ArchiveLocation")%>  />

我会通过添加onitemdatabound事件处理程序来调试数据绑定过程,设置断点并检查DataItem以确保它符合您的预期。

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





相关问题
热门标签