проблема с побегом DataNavigateUrlFormatString в HyperLinkField asp.net - PullRequest
0 голосов
/ 04 июля 2011

Я использую HyperLinkField в своем приложении asp.net.

Однако, когда я использую 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})%>"

Это также не работает.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 17 января 2013

Используйте 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 голос
/ 26 августа 2016

Этот ответ основан на предложении Йохана ван дер Сликке.Я только что добавил 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>
0 голосов
/ 04 июля 2011

Вам необходимо обработать это в событии 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;
...