65.9K
CodeProject 正在变化。 阅读更多。
Home

关于 GridView、HyperLinkField 和 UrlEncode

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.93/5 (9投票s)

2008年4月22日

CPOL

1分钟阅读

viewsIcon

60573

厌倦了为了解决 UrlEncode 问题而将 HyperLinkField 转换为 TemplateField 吗?这个解决方案非常适合你。

引言

BoundField 不同,HyperLinkField 没有像 HtmlEncodeUrlEncode 等方法。但是,对超链接的参数进行“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 编码破解的 HyperLinkFieldGridView 作为参数传递。一切都会没问题的!很简单,不是吗?

关注点

正如在 这篇文章 之后发表评论的人们一样,我也反对微软严格的向后兼容性策略。虽然不同版本的 .NET 应用程序可以并行运行,但为什么要如此关注它呢?这只是我的观点。

© . All rights reserved.