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}&nome={1}" HeaderText="Valores"
GridView
和一个HyperLinkfield
绑定到其中一列,有两个参数,格式如下:
<asp:HyperLinkField DataNavigateUrlFields="id,nome" DataNavigateUrlFormatString="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&nome={1}" HeaderText="Valores" InsertVisible="False" NavigateUrl="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx" Text="Ajustar valores">
<ItemStyle ForeColor="#339933" />
</asp:HyperLinkField>
StringDataNavigateUrlFormatString=“~/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}&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。更新的代码应该可以工作,尽管听起来您的解决方案比这更优雅。我不会说“优雅”“,因为混合演示和代码处理从来都不是我的最爱。你认为我也应该回答这个问题吗?我同意这是一种更干净的解决问题的方法。我会记住这个方法!”!