asp.net的HyperLinkField中的DataNavigateUrlFormatString转义问题

时间:2011-07-04 10:07:03

标签: asp.net gridview hyperlink escaping

我在我的asp.net应用程序中使用HyperLinkField。

然而,当我使用DateNavigateUrlFormation时,我遇到了一些问题:

这是代码:

<asp:hyperlinkfield datanavigateurlfields="tab_name,rowid" 
  DataNavigateUrlFormatString="~\details.aspx?tab={0}&rowid={1}" />

由于某些时候rowid可能包含一些在http中具有指定含义的字符,因此在服务器端我无法获得正确的rowid

例如,一行的rowid可能

AAAAAAAXXX+BA

现在生成的网址将是:

http://xxx/details.aspx?tab=tab_name&rowid=AAAAAAAXXX+BA

由于这里有一个角色+,我想要远离它。

我试过了:

DataNavigateUrlFormatString="~\details.aspx?tab={0}&rowid=<%#Server.HtmlEncode({1})%>"

它也不起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

使用支持数据绑定的TemplateField。

<asp:TemplateField>
    <ItemTemplate>
        <asp:HyperLink runat="server" Text="Link" NavigateUrl='<%# String.Format("~/details.aspx?tab={0}&rowid={1}", Convert.ToString(Eval("tab_name")), Convert.ToString(Eval("rowid"))) %>' />
    </ItemTemplate>
</asp:TemplateField>

这样您就不需要CodeBehind中的代码,也不需要按索引访问列(这可能很容易改变,从而导致将来出现问题)。

答案 1 :(得分:1)

这个aswer基于Johan van der Slikke的一个。我刚刚添加了Uri.EscapeDataString:

<asp:TemplateField>
    <ItemTemplate>
        <asp:HyperLink runat="server" Text="Link" NavigateUrl='<%# String.Format("~/details.aspx?tab={0}&rowid={1}", Uri.EscapeDataString(Convert.ToString(Eval("tab_name"))), Uri.EscapeDataString(Convert.ToString(Eval("rowid")))) %>' />
    </ItemTemplate>
</asp:TemplateField>

答案 2 :(得分:0)

您需要在RowDataBound事件中处理此问题。

if (e.Row.RowType == DataControlRowType.DataRow)
{ 
    e.Row.Cells[indexOfYourColumn].Text = Server.HtmlEncode(e.Row.Cells[indexOfYourColumn].Text);
}

<强>更新

Take a look at this article

根据您可以以编程方式访问超链接字段。

HyperLinkField hLink = GridView1.Columns[0] as HyperLinkField;
hLink.DataNavigateUrlFormatString = "details.aspx?pi=" + GridView1.PageIndex.ToString() + "&eID={0}";

或者我认为你需要的是在 RowDataBound 事件中处理它。

HyperLink hLink = e.Row.Cells[0].Controls[0] as HyperLink;
hLink.NavigateUrl = "test.aspx?q=" + e.Row.Cells[0].Text;