Asp.net 为什么HyperLinkField会替换某些URL中的字段而不是其他URL中的字段?

Asp.net 为什么HyperLinkField会替换某些URL中的字段而不是其他URL中的字段?,asp.net,gridview,Asp.net,Gridview,我有一个页面,其中有一个大的GridView和一个HyperLinkfield绑定到其中一列,有两个参数,格式如下: <asp:HyperLinkField DataNavigateUrlFields="id,nome" DataNavigateUrlFormatString="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&amp;nome={1}" HeaderText="Valores"

我有一个页面,其中有一个大的
GridView
和一个
HyperLinkfield
绑定到其中一列,有两个参数,格式如下:

 <asp:HyperLinkField DataNavigateUrlFields="id,nome" DataNavigateUrlFormatString="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&amp;nome={1}" HeaderText="Valores" InsertVisible="False" NavigateUrl="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx"                 Text="Ajustar valores">
        <ItemStyle ForeColor="#339933" />
 </asp:HyperLinkField>

String
DataNavigateUrlFormatString=“~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&;nome={1}
被替换为
DataNavigateUrlFields=“id,nome”
并且对于某些行来说一切都很好。另一方面,值不会被替换,URL也不完整

因此,我去数据库检查是否存在数据不一致,并从
GridView
上通常被替换的字段和另一个未被替换的字段中提取数据

有什么想法吗?

我同意这个说法,这很可能是由于URL字符的缘故

这是对RowDataBound事件中的字符进行编码的一种方法:

protected void yourGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        i = 0; // the ordinal of the column you need to encode

        DataRowView rowView = (DataRowView)e.Row.DataItem;
        string id = Server.UrlEncode(rowView["id"].ToString());
        string nome = Server.UrlEncode(rowView["nome"].ToString());

        string newURL = String.Format("~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&amp;nome={1}", id, nome);

        e.Row.Cells[i].Text = newURL;
    }
}
您需要在
GridView
的标记中包含类似的内容,以便将其连接到事件处理程序:

OnRowDataBound="yourGridView_RowDataBound"
正如的建议和回复,问题与URL字符编码有关(特别是在本例中,
字符的编码)

为了解决这个问题,我建议使用
TemplateField
而不是
HyperLink
字段,如下所示

        <asp:TemplateField HeaderText="Valores" InsertVisible="False">
            <ItemTemplate>
                <asp:HyperLink ID="HyperLink1" runat="server" 
                    NavigateUrl='<%# "~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa=" + HttpUtility.UrlEncode(Eval("id").ToString()) + "&nome=" + HttpUtility.UrlEncode(Eval("nome").ToString()) %>'
                    Text="Ajustar valores"></asp:HyperLink>
            </ItemTemplate>
            <ItemStyle ForeColor="#339933" />
        </asp:TemplateField>

关键概念是在模板本身中使用
HttpUtility.UrlEncode()
,而不是调用
RowDataBound
事件


完成此操作后,数据库数据将在组成URL之前进行正确的编码,它就可以正常工作。

如何对数据库字符串进行URL编码?是否有办法在网格本身内部进行此操作,或者我是否需要事件挂钩?但我看不到这种行为的任何相关原因。我认为您需要在RowDataBound事件中进行此操作。至于我猜这样做的原因是,ç和/或õ是URL的无效字符,并导致整个字符串被忽略。另请参见@Hanno。有趣的是,从我展示的数据库图片中,记录#1是有问题的,带有ç和õ的记录工作正常。我用C#发布了我的答案,因为我没有看到您指定了一种语言。如果您使用的是VB.NET,则响应类似,但如果您需要帮助翻译,请告诉我。我使用的是C#,但您的回答对我无效。它在
服务器.UrlEncode(rowView[“id”].ToString())
上为我提供了一个“对象引用未设置”,可能是因为rowView对象为空(无法调试,因为这是一个生产系统)。请注意,我已经对其进行了必要的更改,但可能遗漏了一些内容。发现了问题,这确实是一个编码问题(具体来说,URL上的
字符。不过,我的方法不同。我更喜欢使用HyperlinkField作为模板字段,并在aspx页面上组成URL,因为@jadarnel27的示例对我不起作用。我会接受你的答案,因为它切中要害,但解决方案需要改进。@marquito很好,只要你这样做,@jadarnel27在RowDataBound事件中处理类似的事情时,您必须确保您使用的是DataRow(而不是页眉或页脚)。我没有检查这一点,这就是为什么您会得到null。更新的代码应该可以工作,尽管听起来您的解决方案比这更优雅。我不会说“优雅”“,因为混合演示和代码处理从来都不是我的最爱。你认为我也应该回答这个问题吗?我同意这是一种更干净的解决问题的方法。我会记住这个方法!”!