Asp.net 超链接字段不显示为链接
我在Asp.net 超链接字段不显示为链接,asp.net,Asp.net,我在网格视图中有以下列,我的问题是它只呈现文本“下载”,而不是URL <asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}" /> 当我将带有一行的DataTable绑定到网格时,该行中的ArchiveLocation包含以下值: “~/Common/Forms/ExportStream.aspx?path=C:\D
网格视图中有以下列,我的问题是它只呈现文本“下载”,而不是URL
<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}" />
当我将带有一行的DataTable
绑定到网格时,该行中的ArchiveLocation
包含以下值:
“~/Common/Forms/ExportStream.aspx?path=C:\Development\Chase\Exports\ChaseExport-090312073930.zip”
当使用templateField时,您必须告诉它绑定到什么
<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}" NavigateUrl='<%#Eval("ArchiveLocation")%>' />
使用templateField时,您必须告诉它绑定到什么
<asp:HyperLinkField DataNavigateUrlFields="ArchiveLocation" Text="Download" DataNavigateUrlFormatString="{0}" NavigateUrl='<%#Eval("ArchiveLocation")%>' />
我将调试数据绑定过程,方法是添加onitemdatabound事件处理程序,在其中设置断点,然后查看数据项以确保它符合预期
超链接字段位于行模板中,而不是页眉或页脚,对吗 我将通过添加onitemdatabound事件处理程序来调试数据绑定过程,在其中设置断点,然后查看您的数据项以确保它符合您的期望
超链接字段位于行模板中,而不是页眉或页脚,对吗 仅当您希望所有记录使用相同的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;
}
仅当您希望所有记录的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>
解决方法是使用模板字段并将冒号编码为其十六进制表示形式,即%3A
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("ArchiveLocation","{0}").Replace(":", Server.UrlEncode(":")) %>' Text="Download"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
这给了我一个错误:“只有具有数据绑定事件的对象才支持数据绑定表达式。System.Web.UI.WebControl.HyperLinkField没有数据绑定事件。”这给了我一个错误:“只有具有数据绑定事件的对象才支持数据绑定表达式。System.Web.UI.WebControl.HyperLinkField没有数据绑定事件。“