关于 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 应用程序可以并行运行,但为什么要如此关注它呢?这只是我的观点。



