我在我的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})%>"
它也不起作用。
有什么想法吗?
答案 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);
}
<强>更新强>
根据您可以以编程方式访问超链接字段。
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;