none
GridView HyperLinkField DataNavigateUrlFormatString に"?"があるとURLエンコードされない RRS feed

  • 質問

  • お世話になります。Visual Studio 2008 で aspx のページを作成しています。
    SQL Server からデータを取得し、GridView に表を表示させています。
    1つの列の値は日本語で、その日本語語句をもちいてURLを作成しています。
    現状は:

                <asp:HyperLinkField DataTextField="語句" HeaderText="サイト内検索" Target="_blank"
                        DataNavigateUrlFields="語句"
                        DataNavigateUrlFormatString="default.aspx?keyword={0}" />


    としており、default.aspx に値を投げるようなハイパーリンクを作っているのですが、default.aspx?keyword={0} で実際にブラウザ(IE8)に送られたHTMLソースをみると「日本語」({0}の値ですが) の部分がURLエンコードされずにそのままデータベースで登録されている値となってしまいます。 

    ちなみに、DataNavigateUrlFormatString="{0}"

    とした場合は、自動的にURLエンコードされています。

    さらに DataNavigateUrlFormatString="?{0}"  というよりに "?" があると URLエンコードされないことがわかりました。

    さてどうすれば default.aspx?keyword=[URLエンコードされた語句] というハイパーリンクを作成できるでしょうか?

    よろしくお願いいたします。



    2009年8月24日 2:24

回答

  • HyperLinkField はやめて、代わりに TemplateField を使って、それに HyperLink を配置して、その
    NavigateUrl プロパティに Server.UrlEncode メソッドを使って自力でエンコードした文字列を設定
    してはいかがですか? 例えば、以下のような感じです。

    <asp:TemplateField HeaderText="サイト内検索">
        <ItemTemplate>
             <asp:HyperLink ID="HyperLink1"
                  runat="server"
                  Text='<%# Eval("語句") %>'
                  NavigateUrl='<%# "~/default.aspx?keyword=" + Server.UrlEncode((string)Eval("語句")) %>'
                  Target="_blank" />
         </ItemTemplate>
    </asp:TemplateField>

    その他、Query String を使わないで Session を使って受け渡すことも検討してはいかがですか?

    • 回答としてマーク TKSOFT 2009年8月24日 17:05
    • 回答としてマークされていない TKSOFT 2009年8月24日 17:06
    • 回答としてマーク TKSOFT 2009年8月24日 17:11
    2009年8月24日 13:06

すべての返信

  • HyperLinkField はやめて、代わりに TemplateField を使って、それに HyperLink を配置して、その
    NavigateUrl プロパティに Server.UrlEncode メソッドを使って自力でエンコードした文字列を設定
    してはいかがですか? 例えば、以下のような感じです。

    <asp:TemplateField HeaderText="サイト内検索">
        <ItemTemplate>
             <asp:HyperLink ID="HyperLink1"
                  runat="server"
                  Text='<%# Eval("語句") %>'
                  NavigateUrl='<%# "~/default.aspx?keyword=" + Server.UrlEncode((string)Eval("語句")) %>'
                  Target="_blank" />
         </ItemTemplate>
    </asp:TemplateField>

    その他、Query String を使わないで Session を使って受け渡すことも検討してはいかがですか?

    • 回答としてマーク TKSOFT 2009年8月24日 17:05
    • 回答としてマークされていない TKSOFT 2009年8月24日 17:06
    • 回答としてマーク TKSOFT 2009年8月24日 17:11
    2009年8月24日 13:06
  •  SurferOnWww

    回答ありがとうございます。

    >HyperLinkField はやめて、代わりに TemplateField を使って、それに HyperLink を配置して、その
    >NavigateUrl プロパティに Server.UrlEncode メソッドを使って自力でエンコードした文字列を設定

    この方法で行いました。無事URLエンコードされ目的のとおりの動作となりました。

    感謝いたします。


    >Query String を使わないで Session を使って受け渡す

    こちらですが当方まだ技術力がありませんで 「Session を使って受け渡す」という方法がわかりません。
    勉強いたします。
    2009年8月24日 17:11
  • > 「Session を使って受け渡す」という方法がわかりません。

    Session については、以下の Web ページを読むと理解できると思います。

    ASP.NET の状態管理の概要
    http://msdn.microsoft.com/ja-jp/library/75x4ha6s.aspx

    ASP.NET セッション状態の概要
    http://msdn.microsoft.com/ja-jp/library/ms178581.aspx

    2009年8月25日 12:27