1

我有一个大页面,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>

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

所以我去数据库检查是否有一些数据不一致,并从一个通常被替换的字段中提取数据,GridView以及另一个没有被替换的字段。

数据库中的数据是一致的。 当formink超链接字段时,结果1根本没有被替换

有任何想法吗?

4

2 回答 2

2

正如Hanno评论jadarnel27的实际回复所建议的那样,问题与 URL 字符编码有关(特别是在这种情况下是:字符的编码)。

为了解决这个问题,我建议使用aTemplateField代替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 之前被正确编码,并且它可以正常工作。

于 2013-02-26T15:43:53.010 回答
0

我同意Hanno在评论中的说法,这可能是由于 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"
于 2013-02-25T16:07:31.887 回答