关于 GridView、HyperLinkField 和 UrlEncode
厌倦了为了解决 UrlEncode 问题而将 HyperLinkField 转换为 TemplateField 吗?这个解决方案非常适合你。
引言
与 BoundField
不同,HyperLinkField
没有像 HtmlEncode
或 UrlEncode
等方法。但是,对超链接的参数进行“URL 编码”处理是很常见的。对于来自中国、日本或韩国的开发者来说,这会更加熟悉。
背景
我们中的一些人希望微软在 .NET Framework 的下一个版本中添加这样一个常用功能。但到目前为止,在 .NET 3.x 中仍然存在这个问题。我们从 微软的一个反馈报告 中了解到,由于 其关于 .NET Framework 不同版本之间向后兼容性的策略,微软将不会对此进行修改。到目前为止,解决此问题的流行方法是将 HyperLinkField
转换为 TemplateField
,并使用 HttpUtility.UrlEncode
方法手动解决。由于这种转换是不可逆的,当你需要进行一些小的修改时,可能会引入一些不便。
Using the Code
以下代码为你提供了另一种选择,避免转换为 TemplateField
并破解 HyperLinkField
的 UrlEncode 功能
public static void HyperLinkFieldUrlEncodeHack(GridView gridView)
{
if (gridView == null)
{
return;
}
gridView.RowDataBound += delegate(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
{
return;
}
for (int i = 0; i < gridView.Columns.Count; i++)
{
DataControlField field = gridView.Columns[i];
if (field is HyperLinkField)
{
TableCell td = e.Row.Cells[i];
if (td.Controls.Count > 0 && td.Controls[0] is HyperLink)
{
HyperLink hyperLink = (HyperLink)td.Controls[0];
HyperLinkField hyperLinkField = (HyperLinkField)field;
if (!String.IsNullOrEmpty(hyperLinkField.DataNavigateUrlFormatString))
{
string[] dataUrlFields =
new string[hyperLinkField.DataNavigateUrlFields.Length];
for (int j = 0; j < dataUrlFields.Length; j++)
{
object obj = DataBinder.Eval(e.Row.DataItem,
hyperLinkField.DataNavigateUrlFields[j]);
dataUrlFields[j] = HttpUtility.UrlEncode(
(obj == null ? "" : obj.ToString()));
}
hyperLink.NavigateUrl = String.Format(
hyperLinkField.DataNavigateUrlFormatString, dataUrlFields);
}
}
}
}
};
}
你可以简单地调用此方法,并将包含需要 URL 编码破解的 HyperLinkField
的 GridView
作为参数传递。一切都会没问题的!很简单,不是吗?
关注点
正如在 这篇文章 之后发表评论的人们一样,我也反对微软严格的向后兼容性策略。虽然不同版本的 .NET 应用程序可以并行运行,但为什么要如此关注它呢?这只是我的观点。