1

次の形式で、2 つのパラメーターを使用して、列の 1 つに大きくバインドされGridViewたページがあります。HyperLinkfield

 <asp:HyperLinkField DataNavigateUrlFields="id,nome" DataNavigateUrlFormatString="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&amp;nome={1}" HeaderText="Valores" InsertVisible="False" NavigateUrl="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx"                 Text="Ajustar valores">
        <ItemStyle ForeColor="#339933" />
 </asp:HyperLinkField>

文字列DataNavigateUrlFormatString="~/adm/Clipping/Publicidade/Cadastro/ValorPrograma.aspx?programa={0}&amp;nome={1}は に置き換えられDataNavigateUrlFields="id,nome"ます。そして、いくつかの行についてはすべて問題ありません。一方、値は置き換えられず、URL は不完全です。

そこで、データベースにアクセスして、データの不一致がないかどうかを確認し、通常は置き換えられているフィールドと、置き換えられてGridViewいない別のフィールドからデータを取得しました。

データベース内のデータは一貫しています。 ハイパーリンクフィールドを作成するときに、結果 1 がまったく置き換えられない

何か案は?

4

2 に答える 2

2

Hannoコメントで示唆され、 jadarnel27の実際のReplyで回答されているように、問題は URL の文字エンコーディング (特にこの場合は文字のエンコーディング) に関連しています:

この問題を解決するには、次のようにフィールドのTemplateField代わりにa を使用することをお勧めします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 を構成する前にデータベース データが適切にエンコードされ、そのまま機能します。

于 2013-02-26T15:43:53.010 に答える
0

コメントでの Hanno の声明に同意します。これは、無効な URL 文字が原因である可能性があります。

これは、RowDataBound イベントから文字をエンコードする方法の 1 つです。

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}&amp;nome={1}", id, nome);

        e.Row.Cells[i].Text = newURL;
    }
}

GridViewイベント ハンドラーに接続するには、 のマークアップに次のようなものが必要です。

OnRowDataBound="yourGridView_RowDataBound"
于 2013-02-25T16:07:31.887 に答える