【问题标题】:the DataNavigateUrlFormatString escape problem in asp.net's HyperLinkFieldasp.net 的 HyperLinkField 中的 DataNavigateUrlFormatString 转义问题
【发布时间】:2011-07-04 10:07:02
【问题描述】:

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

但是,当我使用DateNavigateUrlFormation 时,我遇到了一些问题:

这是代码:

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

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

例如,可能是一排的rowid

AAAAAAAXXX+BA

现在生成的 url 将是:

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

由于这里有+这个字符,我想解开它。

我试过了:

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

它也不起作用。

有什么想法吗?

【问题讨论】:

    标签: asp.net gridview hyperlink escaping


    【解决方案1】:

    使用支持数据绑定的 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 中的代码,也不需要按索引访问列(这很容易更改,从而导致将来出现问题)。

    【讨论】:

    • 谢谢,这是最方便的方法,应该是公认的答案。但是您忘记了转义 uri 组件。请在下面查看我的答案(无法在此处插入代码示例)。
    【解决方案2】:

    这个回答是基于 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>
    

    【讨论】:

      【解决方案3】:

      您需要在 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;
      

      【讨论】:

      • 但是这个单元格是一个超链接字段,我想知道这是否会使这个列只作为一个文本。\
      • 谢谢,我明天试试。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多